2011-04-05 2 views
1

나는 예외를 잡아서 ELMAH로 기록하고있다.ELMAH - ErrorSignal.Raise no stack info

예외를 잡아 내고 앱에 YSOD를 허용하면 ELMAH는 전체 스택 추적을 기록합니다. 그러나 내가 잡아서 ErrorSignal.Raise(ex)을 사용할 때 스택 추적을 얻지 못합니다.

ErrorSignal.FromCurrentContext().Raise(new System.ApplicationException(exception.ToString(), exception)); 

안녕들 하슈 :

는 또한 아무 소용이 시도?

답변

4

이 그것을 할 수 있습니다 : 당신은 당신이 단지 new을 거라고했습니다 unthrown 제외 ErrorSignal.Raise을 사용하고

ErrorSignal.FromCurrentContext().Raise(
       new System.ApplicationException(
        exception.Message + exception.StackTrace, exception)); 
+2

Color me stunned. 정말. 내 게시물에 설명 된 이유로, 나는 이것을 downvote해야 할 것이다. 전체 스택 트레이스를 가진 예외를 로깅하지 않고 다른 예외의 스택 트레이스를 메시지로 사용하여 예외를 로깅한다. 대부분 올바른 것으로 보이는 결과가 나올 수 있지만, 이는 단지 부차적 인 것이며 반 패턴을 기반으로합니다. – Rytmis

11

. 예외를 throw 할 때 스택 추적이 채워 지므로 처리되지 않은 예외에는 스택 추적이 없습니다. 반면에 ELMAH는 여기에 래핑하는 예외 인스턴스를 잡아낼 것입니다. 디버거에서 보면, 실제로 래핑 예외와 달리 스택 추적을 포함하게됩니다. 대신 (그런데 원래 inherited from을 가지고 있고 요즘 considered obsolete by the framework designers입니다한다), 당신은 당신이 잡은 원래의 예외를 발생해야 System.ApplicationException에서 포장의

.

흥미로운 보조 노트로

: 스택 추적은 당신이 예외를 던질 때,이 채워집니다 때문에 : 반면,

catch (Exception ex) { 
    throw ex; 
} 

원래 스택 추적을 파괴

catch (Exception ex) { 
    throw; 
} 

하지 않습니다합니다 (후자 비트는 원본 스택 추적을 유지하는 CIL rethrow opcode를 방출합니다.