2010-11-24 4 views
70
예를 들어

, ... 전체 스택 추적을 예외로 인쇄하는 방법은 무엇입니까? 한 곳에서

//---------------a 
try 
{ 
    // some network call 
} 
catch(WebException we) 
{ 
    throw new MyCustomException("some message ....", we); 
} 

... 그리고 다른 곳에서 ...

//--------------b 
try 
{ 
    // invoke code above 
} 
catch(MyCustomException we) 
{ 
    Debug.Writeline(we.stacktrace); // <---------------- 
} 

I 인쇄 스택 트레이스, 그것은 단지 에게 A에서 B로 시작하십시오 WebException에서 내부 스택 추적을 포함하지 않습니다.

어떻게 모든 스택 추적을 인쇄 할 수 있습니까 ???

+0

WebException을 다시 던지기보다는 새로운 예외를 던 졌기 때문에 원본 WebException의 스택 추적이 인쇄되지 않습니다. 원래 예외 스택을 보존 (및 출력)하려면'throw new MyCustomException (...)'대신'throw;'를 사용하십시오. – Beel

답변

121

을 나는 보통 전체 예외 정보를 제공하는 예외에 매소드로 .toString()를 사용 (내부 스택 추적 포함) :

catch (MyCustomException ex) 
{ 
    Debug.Writeline(ex.ToString()); 
} 

샘플 출력 :

ConsoleApplication1.MyCustomException: some message .... ---> System.Exception: Oh noes! 
    at ConsoleApplication1.SomeObject.OtherMethod() in C:\ConsoleApplication1\SomeObject.cs:line 24 
    at ConsoleApplication1.SomeObject..ctor() in C:\ConsoleApplication1\SomeObject.cs:line 14 
    --- End of inner exception stack trace --- 
    at ConsoleApplication1.SomeObject..ctor() in C:\ConsoleApplication1\SomeObject.cs:line 18 
    at ConsoleApplication1.Program.DoSomething() in C:\ConsoleApplication1\Program.cs:line 23 
    at ConsoleApplication1.Program.Main(String[] args) in C:\ConsoleApplication1\Program.cs:line 13 
+0

아주 좋네. 나는 그것을 할 수있는 간단한 방법을 찾고 있었다. 그리고 여기있다. 약간의 우려는 예를 들어 exception.StackTrace 객체를 사용하는 것만큼이나 명확하지 않다는 것입니다. 같은 것을하기위한 좀 더 명확한 방법이 있는지 궁금합니다. – codea

+3

일부 라이브러리는 'ToString' 메서드를 무시하고 전체 정보 대신 사용자 정의 메시지를 인쇄합니다 (잘못된 코딩 방법이므로 ** 그렇게하지 마세요) – Dinei

42

과 같은 기능을 사용

다음
public static string FlattenException(Exception exception) 
    { 
     var stringBuilder = new StringBuilder(); 

     while (exception != null) 
     { 
      stringBuilder.AppendLine(exception.Message); 
      stringBuilder.AppendLine(exception.StackTrace); 

      exception = exception.InnerException; 
     } 

     return stringBuilder.ToString(); 
    } 

이처럼 호출 할 수

try 
{ 
    // invoke code above 
} 
catch(MyCustomException we) 
{ 
    Debug.Writeline(FlattenException(we)); 
} 
+0

+1하지만 단순히 대신 AppendLine을 사용할 수 있습니다 –

+10

또는 ToString을 사용할 수 있습니까? – Justin

+0

ToString을 사용하고 있으며 괜찮다고 생각합니다. 내가 유일한 안쪽 예외 (실제 이유) 또는 비슷한 따기를 원한다면 나는 앤드류의 해결책으로 갈 것이다. 둘 다 작동한다. :) – EeKay

5

예외를 다음 함수에 전달하면 예외의 모든 메서드와 세부 정보가 제공됩니다.

+0

매우 도움이됩니다. 귀하의 예를 기반으로 [확장 방법] (https://github.com/VeaceslavWD/EasySharp/blob/master/NHelpers/CustomExtensionMethods/ExceptionHelper.cs)을 만들었습니다. BTW, 반복 횟수가 많은 경우'StringBuilder' 클래스를 사용하는 것이 좋습니다. –

관련 문제