2011-09-06 5 views
6

예외를 던지기를 원하지만 사용자 지정 메시지와 함께 스택 트레이스를 유지하려고합니다. 나는 여러 가지 실을 겪었다.예외를 던지지만 스택 추적을 유지하십시오.

**The remote server returned an error: (401) Unauthorized.** 

[WebException: The remote server returned an error: (401) Unauthorized.] 
original stack trace 

[NewException: newMessage] 
New Stack Trace 

좋은 것은 모든 화면에 존재입니다 : 마지막 appraoch 죽음의 화면에 출력 (사용자 정의 예외 기본 클래스 생성자를 호출하는 생성자)를 사용

catch (Exception ex) 
{ 
throw; // Message is read only but stacktrace persist 
throw ex; // Message is readonly and strack trace also blows .. worst! 
throw new CustomException("My exception");// Message can be overridden but stacktrace lost 
throw new CustomException("My message",ex);// same as above. However if this constructor in exception class calls same constructor of base class then .. see below 
} 

뭔가 같다. 그러나 맨 위에는 예외가 원래 메시지가 아닌 '새 메시지'로 표시되기를 원합니다.

내 질문을 조정 : 어떻게 원래의 스택 추적하지만 사용자 정의 오류 메시지와 함께 죽음의 화면에 표시 할 수 있습니까?

+1

이 예외를 반환하는 웹 서비스인가? – Oded

+0

필자의 예에서는 실제로 웹 서비스 호출입니다. 그러나 예외는 DivisionByZero 나 sqlException과 같은 것이 될 수 있기 때문에 중요하지 않습니다. 아이디어는 사용자에게 원래 스택 추적을 알리는 것입니다. 그러나 개발자는 기본 예외 메시지를보다 도움이되는 사용자 정의로 사용자 정의합니다. – helloworld

+0

아니요, 중요하지 않습니다. Webservice 프레임 워크에는 예외에 대한 자체 아이디어가 있습니다. –

답변

8
throw new CustomException("My message",ex);// same as above (... stacktrace lost) 

마지막 의견에 대한 귀하의 결론에 잘못된 내용이 있습니다. stacktrace는 내부 Exception에 보관됩니다. 표준 보고서 (Exception.ToString() 포함)는 전체 스택 추적을보고합니다. 이것은 여러분이 생성자를 올바르게 얻을 때 여러분이 보게되는 것입니다. (항상 올바른 기본 ctor를 호출하십시오!).

그러나 나는 [WebException]을 인식하지 못합니다. WCF가 필요합니다

<serviceDebug includeExceptionDetailInFaults="true"/> 

여러분의 웹 환경에는 클라이언트에 대한 오류 정보를 표시하지 않는 유사한 기능이 있다고 생각합니다.

3

네 번째 방법은 일반적인 방법과 설정된 패턴입니다. 예외 처리 (또는 제기)와 표시 또는 기록 방법을 혼동해서는 안됩니다.

(잡힌) 예외의 출력을 제어 할 수 있습니다 (즉, 해당 코드를 변경/작성할 수있는 경우). Exception.ToString() 메서드를 사용하면 모든 "내부"예외를 인쇄 할 수 있습니다.

설명 : 때로는 내부 예외가 응용 프로그램에서 의도적으로 표시되지 않는 경우가 있습니다. 예를 들어 WCF (Windows Communication Foundation)에서 IncludeExceptionDetails (config, code, ...를 통해)이 설정되어 있지 않으면 내부 예외가 서버에서 클라이언트로 전송되지 않습니다. 이는 내부 예외가 구현 세부 사항으로 간주되어 공격자에게 응용 프로그램을 중단시키는 중요한 정보를 제공 할 수 있기 때문에 일반적으로 수행됩니다.

0

StackTrace 속성을 재정의하는 방법은 무엇입니까?

class CustomException : Exception { 

    public CustomException(string message, Exception inner) : base(message, inner) { 
    } 

    public override string StackTrace { 
     get { 
      if (InnerException != null) { 
       return InnerException.StackTrace; 
      } 
      return base.StackTrace; 
     } 
    } 
} 
+0

감사합니다! 그것을 시도한 ... 죽음의 노란색 화면이 표시되는 동안, 반환에 breakpoing InnerException.Stacktrace는 세 번 호출하고 원래 stacktrace 보여 주었다. 하지만 이상한 것은 여전히 ​​새로운 스택 추적을 표시한다는 것입니다. ( – helloworld

+0

@enableDeepak : 우주가 스스로 붕괴 될 것임을 알지 못했습니다 ... –

0

나는

그러나이 개발하는 동안, 나는 마침내와 더불어, # 만약 내부 (! DEBUG)를 전체 캐치 조항을 넣어 매우 유용 ... 옵션 4가 가장 좋습니다, 동의 디버그 모드에서 컴파일을 허용하려면 다음을 입력하십시오.

#if (!DEBUG) 
catch (Exception ex) 
{ 
    // Catch logic for Release mode 
} 
#endif 
finally { } 

이렇게하면 최상위 레벨이 아닌 오류가 발생한 지점에서 API가 중단됩니다.

#if의 습관을 들지 마십시오.거의 모든 다른 경우에, 방법의 앞에

[Conditional("DEBUG")] 

를 사용하는 대신

관련 문제