Как мне зарегистрировать исключение с полным стеком вызовов? - PullRequest
4 голосов
/ 11 октября 2010

Я хочу использовать 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)

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

Ответы [ 3 ]

5 голосов
/ 23 июня 2012

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

var currentStack = new System.Diagnostics.StackTrace(true);
return currentStack.ToString();
2 голосов
/ 11 октября 2010

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

1 голос
/ 11 октября 2010

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

...