ELMAH - ErrorSignal.Raise нет информации о стеке - PullRequest
1 голос
/ 05 апреля 2011

Я ловлю исключение и регистрирую его в ELMAH.

Если я не уловил исключение и не позволил приложению YSOD, ELMAH регистрирует трассировку полного стека.Однако, когда я ловлю и использую ErrorSignal.Raise(ex), я не получаю трассировку стека.

Я также пытался безрезультатно:

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

Whassup?

Ответы [ 2 ]

11 голосов
/ 14 августа 2012

Вы используете ErrorSignal.Raise с неисключенным исключением, которое вы только что new подняли. Трассировка стека заполняется, когда вы генерируете исключение, поэтому у вашего неисключенного исключения не будет трассировки стека. ELMAH, с другой стороны, будет перехватывать экземпляр исключения, который вы здесь переносите - который, если вы посмотрите на него в отладчике, фактически будет содержать трассировку стека, в отличие от исключения переноса.

Вместо включения в исключение System.ApplicationException (которое, кстати, изначально должно было иметь , унаследованное от , а в настоящее время считается разработчиками фреймворка устаревшим ), вам следует просто поднять оригинальное исключение, которое вы поймали.

В качестве интересного примечания: поскольку трассировка стека заполняется при выдаче исключения, это:

catch (Exception ex) {
    throw ex;
}

уничтожит исходную трассировку стека, тогда как

catch (Exception ex) {
    throw; 
}

не будет (последний бит выдаст код операции CIL rethrow, который сохраняет исходную трассировку стека).

4 голосов
/ 05 апреля 2011

Это будет сделано:

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