C#:我可以从CLR的未处理异常中获取详细信息吗?

时间:2010-01-12 16:36:22

标签: c# .net exception-handling clr

首先,我很抱歉一定是重复的帖子。我似乎无法在SO上缩小我的搜索范围并谷歌找到我正在寻找的东西。

我目前正在一家商店工作,他们喜欢冒泡的例外。当编译的应用程序进行测试时,尝试获取异常的详细信息(消息和堆栈跟踪)是一件很大的痛苦。 Windows显示了那个熟悉的盒子,它缺少任何细节。

在花了将近一个小时后发现测试盒的水晶报告版本错误之后,我添加了这个简单的代码,可能很熟悉。

    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 个答案:

答案 0 :(得分:1)

如果要配置日志输出,请使用log4net

答案 1 :(得分:0)

我正在使用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

接受我的道歉我没有时间重写它,我只是复制了原始代码,我相信它仍然有用。

由于

答案 2 :(得分:0)

如果你知道如何在VB.NET中编码,那么Shimmy的解决方案很方便。

然后你可以递归地进入ex.InnerException.InnerException. ......依此类推......构建一个完整的消息

(1)如果ex.Message不是nullEmpty,请显示。

(2)如果ex.InnerException不是null则显示ex.InnerException.Message

答案 3 :(得分:0)

您可以选择在条件编译符号中包装调试处理代码。这将允许您提供您想要用于测试目的的详细日志记录,但在应用程序的发布版本中最终用户无法使用这些日志记录。

答案 4 :(得分:0)

您似乎错过了try-catch方法中的顶级Main()。有关示例,请参阅one of my answers

我不会使用MessageBox,而是使用一个静态方法以您想要/需要的方式记录问题,然后显示一个通用的“意外致命错误。[Bla bla bla]”消息并在Ok上杀死正在运行的进程。

答案 5 :(得分:0)

你能使用Enterprise Library吗?有可能对您有用的异常处理和日志记录块。您可以将异常处理块配置为notify and rethrow原始异常,并使用Logging Block记录详细信息。它可以是一个陡峭的山坡,可以抓住它,但我认为它最终是值得的。