2012-06-07 2 views

답변

5

두 번째 예제에서는 catch 된 예외를 무시하고 대신 내부 예외를 사용합니다. 일반적으로 첫 번째 예제에서와 같이 코딩합니다. 만약 eInnerException 사용하는 두 번째 경우

catch(Exception e) 
{ 
    throw new Exception("some Exception", e); 
} 

, 그리고 e에서 데이터 : 첫 번째 경우

, 잡힌 예외 ( e)는 새로운 예외의 InnerException는 던지고진다 분실되었습니다 :

catch(Exception e) 
{ 
    throw new Exception("some Exception", e.InnerException); 
} 
+0

다른 말로하면 예외 e가 객체 e에 포함됩니다. – Jorge

+0

@ Jorge - 예, 맞습니다. – Oded

3

첫 번째 예제는 일반적으로 더 정확합니다. 다른 예외의 결과로 새 예외를 던지면 원본을 새 예외의 내부 예외로 포함해야합니다.

그러나 이것은 일반적으로 사실이 아닙니다. 은 실제 오류에 대한 다른 코드의 래핑을 취소하려는 아주 특정한 경우에 유용 할 수 있습니다.

catch (Exception ex) 
{ 
    throw; 
} 

가 보존 원래 스택 추적 원래 예외가 발생합니다 :

try { 
    // some reflection call 
} catch (TargetInvocationException e) { 
    // Reduce the layers of data a developer has to dig through by using the real 
    // exception when I re-wrap 
    throw new MyException("some message", e.InnerException); 
} 
2

예외를 다시 던질 수있는 세 가지 방법이 있습니다.

catch (Exception ex) 
{ 
    throw ex; 
} 

원본 예외는 발생하지만 원래 스택 추적은 손실됩니다. 스택 추적은 이제이 행을 예외의 시작 자로 표시합니다.

catch (Exception ex) 
{ 
    throw new Exception("...", ex); 
} 

새로운 예외가 발생하지만, 원래 예외 새로운 예외 InnerException로서의 스택 트레이스를 보존한다.

첫 번째 사례는 실패로 정리해야하지만 성공하지 못한 경우에 유용합니다. 두 경우 모두 정리해야 할 경우 catch 절이 아닌 finally 절을 사용합니다. 아니면 여기에 예외가 발생했음을 기록하고 발신자가 처리하도록하기 만하면됩니다.

두 번째 사례는 전혀 유용하지 않습니다. 왜 스택 추적을 숨기고 있습니까? 약간의 희귀 한 상황이 유용 할 수 있지만, 나는 아무 것도 모른다.

세 번째 경우는 단일 유형의 예외 (또는 패밀리 유형)를 반환하려는 경우에 주로 사용됩니다. 예를 들어, 텍스트 파싱 메서드이고 모든 예외 (치명적이지 않은 예외)가 예외가 발생한 텍스트의 줄 번호와 같은 추가 정보를 제공하는 ParseException (또는 기타)로 바뀌기를 원합니다.

제공 한 두 번째 예제에서 발견 된 예외는 완전히 삭제됩니다. 새로운 예외가 생성되어 원의 예외의 InnerException가이 새로운 예외의 InnerException가됩니다.중간 예외를 제거하는 것이 유용한 시나리오는 없다고 상상할 수 있습니다.