Получить метод, класс и номер строки из StatckTrace в событии Application_UnhandledException - PullRequest
4 голосов
/ 20 мая 2011

Я занимаюсь разработкой приложения для Windows Phone 7 Silverlight. Я хочу сделать обработку ошибок уровня приложения вместо того, чтобы писать try ... catch ... во всех методах. Мне нужно извлечь имя метода, имя класса и номер строки, где произошла фактическая ошибка. Ниже приведен демонстрационный код. В событии Application_UnhandledException я ожидаю Method = "GenerateError" и Class = "ExceptionTesting" . Кроме того, я хочу получить LineNumber, где произошла фактическая ошибка (это не показано в коде).

Код для генерации ошибки:

public partial class ExceptionTesting : PhoneApplicationPage  
{
    // Generate Error to Test Exception Handling
    private void GenerateError()
    {
        Int16 i = Convert.ToInt16("test");
    }
}

Код, который обрабатывает исключение уровня приложения:

// Code to execute on Unhandled Exceptions
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
StackTrace st = new StackTrace();

var query = st.GetFrames()         // get the frames
        .Select(frame => new
        {                   
            Method = frame.GetMethod(),
            Class = frame.GetMethod().DeclaringType
        });

foreach (var q in query)
{
    if (q.Method.Name.Contains("GenerateError"))
    {
        MessageBox.Show("Class: " + q.Class + ", Method: " + q.Method);
    }
}

if (System.Diagnostics.Debugger.IsAttached)
{
    // An unhandled exception has occurred; break into the debugger
    System.Diagnostics.Debugger.Break();
}
}

Ответы [ 2 ]

3 голосов
/ 20 мая 2011

Метод Application_UnhandledException не вызывается из вашего метода, где происходит исключение, поэтому, как вы обнаружили, new StrackTrace() не будет иметь смысла.

Чтобы получить трассировку стека для места, где произошло исключениепроизошло, используйте e.Exception.StackTrace.Обратите внимание, что настоящее исключение может быть заключено в другое исключение, возможно, в несколько уровней (e.Exception.InnerException).

1 голос
/ 16 января 2012

Вы также можете использовать BugSense для получения этой информации.

Отказ от ответственности: я один из соучредителей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...