2010-10-11 5 views
4

Я хочу использовать ELMAH, чтобы регистрировать исключение (не бросая его полностью вверх по стеку вызовов), и он регистрирует весь стек вызовов.Как регистрировать исключение с полным стеком вызовов?

Пример кода:

protected void Page_Load(object sender, EventArgs e) 
    { 
     DoSomething(); 
    } 

    private void DoSomething() 
    { 
     try { TrySomething(); } 
     catch (Exception ex) { LogException(ex); } 
    } 

    private void TrySomething() 
    { 
     throw new NotImplementedException(); 
    } 

    public static void LogException(Exception ex) 
    { 
     var currentStack = new System.Diagnostics.StackTrace(true); 
     Elmah.ErrorSignal.FromCurrentContext().Raise(ex); 
    } 

Теперь, в рамках метода LogException я могу видеть стек вызовов, говоря мне DoSomething() под названием TrySomething(), и бросил исключение, но я не могу видеть вызов стек показывает мне Page_Load(), называемый DoSomething(). Я хочу видеть полный стек вызовов.

Пример того, что ex.StackTrace выглядит внутри метода LogException:

at WebApplication1._Default.TrySomething() in C:\Projects\test\GeneralTests\WebApplication1\Default.aspx.cs:line 26 
at WebApplication1._Default.DoSomething() in C:\Projects\test\GeneralTests\WebApplication1\Default.aspx.cs:line 20 

я могу получить полный стек вызовов из System.Diagnostics.StackTrace(), например:

at WebApplication1._Default.LogException(Exception ex) 
at WebApplication1._Default.DoSomething() 
at WebApplication1._Default.Page_Load(Object sender, EventArgs e) 
[snip] 

(и я могу получить номера строк и исходные данные файла, прогуливая каждый кадр StackTrace)

Но как я вставляю это в исключение или создаю новое исключение с помощью этого стека вызовов de хвост? Есть ли элегантный способ сделать это? Я пропустил что-то действительно очевидное ?!

+0

проверить эти ответы на вопросы, связанные с, которые обеспечивают лучшее понимание того, почему вы не получите полный стек вызовов: http://stackoverflow.com/a/6094700/945456 и http://stackoverflow.com/a/24297684/945456 –

ответ

1

Когда приложение скомпилировано без флагов отладки, стек не обязательно сохраняется в процессе выполнения. Вы можете гарантировать только каждый записываемый предмет, добавив try/catch для каждого метода.

+0

Вы имеете в виду, что вызовы методов могут быть включены в последовательность выполнения? В противном случае я не уверен, что понимаю, что вы говорите - стек вызовов должен быть сохранен !? – Alex

+0

Да, я думаю, что это вложение. Попробуйте/поймать, обойдется или всегда будет работать в режиме отладки. – cjk

+0

@Alex: он означает, что компилятор (и JIT) часто оптимизирует ваш код с помощью встроенных методов (хотя вы можете предотвратить это с помощью MethodImplAttribute); в этом случае вы не получите полную трассировку стека. – ShdNx

1

Вы просматривали результаты Exception.ToString()? Он включает в себя трассировку стека. Включает ли он вид, который вы ищете?

+2

ex.StackTrace - это строковое представление текущего (внутреннего) стека вызовов, однако он не показывает мне стек вне исключения. Я обновлю вопрос с результатами ex.StackTrace и тем, что мне нужно – Alex

4

Вы можете сделать что-то вроде этого, чтобы получить полный стек, когда ocurrs ошибки:

var currentStack = new System.Diagnostics.StackTrace(true); 
return currentStack.ToString(); 

 Смежные вопросы

  • Нет связанных вопросов^_^