2016-08-29 4 views
1

사용자 정의 예외를 사용할 수 있습니다. 예외는 다음과 같이 throw 될 수 있습니다.사용자 정의 예외 - catch-in을 시도하십시오. C#

try 
{ 
    int foo = int.Parse(token); 
} 
catch (FormatException ex) 
{ 
    //Assuming you added this constructor 
    throw new ParserException(
     $"Failed to read {token} as number.", 
     FileName, 
     LineNumber, 
     ex); 
} 

그러나 정상적인 try catch 블록에서는 예외를 발생 시키면 스택 추적이 지워집니다.

try 
     { 
     ForthCall(); 
     } 
     catch (Exception ex) 
     { 
     throw ex; 
     } 

그래서 사용자 정의 예외에서 스택 추적을 지우지 않고 예외를 어떻게 사용합니까?

+3

ParserException 생성자에서 try 블록 (FormatException)의 원본 예외를 내부 예외로 전달하므로 InnerException 멤버를 통해 원래 스택 추적을 얻을 수 있습니다. – Den

+0

어떻게 내부 예외로 말할 수 있습니까? –

+0

언급 한 링크의 코드에 따르면 그러나이 링크는 사용했던 생성자의 완전한 구현을 제공하지 않습니다. ParserException (string msg, Exception inner) : base (msg, inner) { }을 수정하십시오. 그래서 사용자 지정 예외를 잡는 동안 원래 Stack을 YourCustomExceptionObject.InnerException.StackTrace로 가져올 수 있습니다. – Den

답변

1

여러 가지 방법이 있습니다. 당신이 할 수 있도록

이 링크 In C#, how can I rethrow InnerException without losing stack trace?에서 언급 한 바와 같이, 당신은 예외가 처리 여부를 여부 핸들러는 부울을 반환하도록

try 
{ 
    task.Wait(); 
} 
catch(AggregateException ex) 
{ 
    ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); 
} 

유사한 코드로 또 다른 방법을 ExceptionDispatchInfo Class 입니다 사용할 수 있습니다 당신의 캐치 절에서 이것을 사용

HandleException 사용자 정의 예외 핸들러입니다
catch (Exception ex) { 
    if (!HandleException(ex)) { 
    throw; 
    } 
} 

. 이 링크에서 찾았습니다 : How to throw exception without resetting stack trace?

0

예외 객체와 함께 throw을 사용할 때마다 스택 추적이 채워집니다. (예외가 생성 될 때 스택 추적을 채우는 Java와 비교하십시오.) catch 절에서만 수행 할 수있는 예외 개체없이 throw을 사용하면 catch 된 예외 개체가 변경없이 다시 throw됩니다.