2011-05-01 2 views
0

"매우 예외적 인 예외 만 잡아서 던져야 함"이라는 잘 알려진 문구입니다. 그러나 "예외적 인"예외는 어떻게 결정됩니까?예외가 예외인지 여부 순환

예를 들어, 잘못된 암호는 서비스에 로그인하는 데 매우 일상적이므로 매우 예외적 인 것은 아닙니다. 웹 응용 프로그램의 통계에는 특정 사용자가없는 경우 5 번 시도 할 때마다 한 번의 잘못된 로그인 시도가 표시됩니다. 마찬가지로 온라인 상점에서 바구니를 사용하여 계산대로 가려고 시도하는 경우 이는 매우 공통적입니다 (특히 신규 사용자의 경우). 그러나 찾을 수없는 파일은 어느쪽으로 든 갈 수 있습니다. 나는 보통 메서드가 그 작업을 수행 할 뭔가를 놓치고 예외를 던지면 약간 혼란스러워지는 선을 따라 작업합니다. 경우에 따라 예외적 인 파일이 누락 된 매우 잠긴 프로덕션 환경과 비교할 때 찾을 수없는 파일 (예 : 많은 사용자가 사용하는 파일 공유)이 공통적 일 수 있습니다.

예외가 예외인지 아닌지를 추론하는 올바른 방법입니까? 네트워크 연결 등의 예외를 예외적으로 쉽게 필터링 할 수 있지만 어떤 경우는 판단하기가 어렵습니다. 주관적입니까?

덕분에

+0

일반적인 문제 일 뿐이므로 예외가 발생해서는 안됩니다. – nos

+0

이것은 정말로 유명한 문구입니까? 그것은 정확히 무엇을 의미합니까? 누군가가 그것을 정의하는 것을 어디에서 보았습니까? 이 글이 의미하는 바를 정의하라고 요구하고있는 것 같지만 아직 잘 알려져 있지 않다고 생각합니다. 나는 구글 검색에서 그것의 _any_ 언급을 찾을 수 없었다. – Hogan

+0

그러나 귀하의 질문은 정말 - 언제 내 코드 예외 (즉 _throw_) 처리해야합니다. 대답은 간단합니다. 코드가 복구되지 않는 상황이 발생하면. _ 물론 다른 모든 것과 마찬가지로이 규칙에 예외 (말장난 의도)가 있습니다 _ – Hogan

답변

1

나는 정직하게, 매우 주관적인 생각, 그래서 내가 예외를 사용해야 할 때 파악의 방법을 피하기 위해 선호합니다.

대신에, 나는 세 가지를 고려하는 것을 선호 :

  1. 그것이 내가 호출 스택은 하나의 레벨보다 더 긴장을 풀 수 있도록 할 수 있습니다 가능성이 있습니까?
  2. 다른 방법이 있습니까? (null 또는 오류 코드 등을 반환합니다.) 그렇다면 성능 문제가 가장 적습니까?
  3. 둘 중 어느 것도 명확한 결정을 내리지 못하면 코드를 유지 관리해야하는 사람이 더 쉽게 읽을 수 있습니까?

# 1이 맞으면 성능 문제가 심각하지 않지만 코드를 반환 할 필요가 없도록 개발 시간을 단축 할 수 있으므로 예외를 사용하도록 선택할 것입니다. 필요한 경우 호출 스택 위로 전파하도록하는 논리). 예외를 사용할 때 호출 스택 unwinding은 개발 시간 동안 무료입니다.

# 2가 true이고 두 개 이상의 프레임 (어쩌면 두 개입니까?)이 호출 스택을 넘지 않거나 심각한 성능 우려가있는 경우 (예 : 예를 들어) 예외를 수반하지 않는 다른 방법을 찾기 위해 열심히 노력할 것입니다.

예외는 예외를 지원하는 프로그래머를위한 도구 일뿐입니다. 나는 그들이 "예외적 인 것"에 관해서 어떤 본질적인 가치를 가져야한다고 생각하지 않는다. 대신, 내가 이 작업을위한 최상의 도구 인 경우 사용한다고 말합니다..

+1

C++와 같은 언어에서는 예외를 사용하도록 선택하고 모든 코드가 예외 안전해야하며 리소스를 올바르게 릴리스해야하는 등의 고려 사항이 있습니다. –

+0

좋은 생각. "호출 스택을 두 개 이상의 레벨에서 풀어 버려"라는 것은 무엇을 의미합니까? – dotnetdev

+0

@ dotnetdev : 예외를 몇 단계 위로 포착하려는 경우 (예 : 예외 코드를 호출 한 곳과 동일한 기능에서 예외를 포착하지 않으려는 경우) 예외는 자연스럽게 함수 스택을 호출 스택의 위로 이동하여 함수 컨텍스트를 호출하는 방법의 역순으로 삭제합니다. 리턴 코드를 사용하려면 각 intervening 함수 레벨 (예 :'if (errorCode! = SUCCESS) return errorCode; ')에서 논리를 처리해야하며 때로는 10 회 쓸 수 있습니다. –