C #: Могу ли я получить детали из необработанного исключения из CLR? - PullRequest
2 голосов
/ 12 января 2010

Во-первых, извините за то, что должен быть дубликат поста. Кажется, я не могу сузить свой поиск на SO и Google, чтобы найти то, что я ищу.

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

Потратив около часа, чтобы выяснить, что тестовая коробка имеет неверную версию отчетов Crystal, я добавил этот простой код, с которым, возможно, знаком каждый.

    static void Main(string[] arg)
    {
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run( ... );
    }

    static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
        MessageBox.Show(e.Exception.ToString());
    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        MessageBox.Show((e.ExceptionObject as Exception).ToString());
    }

Это выполнит работу, но мне не разрешено ее регистрировать. Есть ли способ в app.config или через настройки реестра, чтобы CLR отображал или регистрировал подробности исключений для скомпилированного приложения .net?

Заранее спасибо за помощь.

Ответы [ 6 ]

1 голос
/ 12 января 2010

просто используйте log4net , если вы хотите настроить вывод журнала.

0 голосов
/ 14 января 2010

Можете ли вы использовать Enterprise Library ? Существуют блоки обработки исключений и ведения журнала, которые могут быть вам полезны. Вы можете настроить блок обработки исключений так, чтобы уведомлял и перебрасывал исходное исключение и регистрировал детали с помощью блока регистрации. Это может быть что-то вроде крутого холма, чтобы подняться, чтобы справиться с этим, но я думаю, что это в конечном итоге того стоит.

0 голосов
/ 14 января 2010

Похоже, вам не хватает верхнего уровня try-catch в вашем Main() методе. См. один из моих ответов для примера.

И я бы не стал использовать MessageBox, но один единственный статический метод, который регистрирует проблему так, как вам нужно / нужно, а затем показывает общее сообщение «Произошла непредвиденная фатальная ошибка. [Bla bla bla]» и убивает запущенный процесс на Ok.

0 голосов
/ 14 января 2010

У вас есть возможность обернуть код обработки отладки в символы условной компиляции. Это позволит вам предоставить подробное ведение журнала, которое вы хотели для целей тестирования, но оно не будет доступно конечным пользователям в сборках выпуска приложения.

0 голосов
/ 14 января 2010

Решение Шимми удобно, если вы знаете, как кодировать в VB.NET.

Затем вы можете рекурсивно перейти к ex.InnerException.InnerException. ... и так далее ..., чтобы создать полное сообщение

(1), если ex.Message не null или Empty, покажите его.

(2), если ex.InnerException не null показать ex.InnerException.Message.

0 голосов
/ 12 января 2010

Я использую WPF, поэтому здесь, где всплывают все необработанные исключения, это может быть полезно для ваших нужд:

Private Sub Application_DispatcherUnhandledException(ByVal sender As Object, ByVal e As System.Windows.Threading.DispatcherUnhandledExceptionEventArgs) Handles Me.DispatcherUnhandledException
    'TODO: Log error'

    Dim sb As New System.Text.StringBuilder(e.Exception.Message & vbCrLf)

    Dim ex = e.Exception.InnerException
    While ex IsNot Nothing
        sb.AppendLine("______________ inner exception: ______________")
        sb.AppendLine(ex.Message)
        sb.AppendLine(vbCrLf)
        ex = ex.InnerException
    End While

    If MessageBox.Show(sb.ToString, "Exception caught", MessageBoxButton.OKCancel) = MessageBoxResult.Cancel Then Stop
    e.Handled = True
End Sub

Примите мои извинения, у меня не было времени переписать его, я просто скопировал свой оригинальный код, я уверен, что он по-прежнему полезен.

Спасибо

...