如何在Windows窗体应用程序中记录异常

5

我读了很多关于捕获基本异常的坏处的文章,我必须承认我也这样做了:

try{
    ...
}
catch (Exception exception){
    MessageBox.Show(exception.Message, "Error!");
    MyLogger.Log(exception.Message);
}

现在我想做得正确些,并有一些关于它的问题:

  1. 我应该捕获哪些异常(例如,文件操作需要FileNotExists,但TableAdapter或ReportClass(CrystalReports)需要什么)
  2. 在哪里可以看到对象可能抛出的异常列表(例如TableAdapter)
  3. 在Windows窗体应用程序中,我在哪里可以设置一个静态方法,将任何异常记录到文件中
  4. 还有其他建议吗?
6个回答

7
  1. 尽可能捕获你可以合理处理的异常。例如,如果你试图打开一个文件进行写入,你应该预期到可能会出现文件只读的情况,这将抛出异常。但在同样的情况下,你不会尝试捕获空参数异常,因为那是程序员的错误。

  2. 它们应该在MSDN的函数参考中找到(你需要查找每一个)。对于用户定义的函数,除非有额外的文档或概要注释,否则你将不得不深入挖掘。

3, 4. 考虑使用.NET的日志记录库


我同意这些观点。我还要补充第二点,对于你自己编写的会抛出异常的方法,重要的是要记录在哪种情况下会抛出哪种异常,以便调用者知道如何处理它。 - Meta-Knight
有没有任何关于 Windows Forms 中的日志记录和异常处理(例如 UnhandledException、Application.ThreadException 事件等)的良好模式和实践方法(可能在 MSDN -Microsoft 上)? - Kiquenet
未找到链接:http://stackoverflow.com/questions/1715439/best-logging-library-for-net/1715446#1715446 - Kiquenet

5

我有一件事情要补充。如果你只想记录异常而不影响程序流程,你可以这样做:

try
{   
    ...
}
catch (Exception exception)
{    
   MyLogger.Log(exception.Message);

   throw;
}

2
  1. 决定哪些异常可以合理地从应用程序逻辑中恢复,由您自己决定。
  2. 异常是由方法调用引发的,而不是对象。在Visual Studio中,Intellisense解释会告诉您一个对象抛出了哪些异常(前提是XML文档描述了方法抛出的异常)。
  3. 与其使用静态方法,不如响应Application.ThreadException事件。提供的链接有示例。MSDN

2
您可以在应用程序事件文件中设置未处理异常的事件。(这里有一个VB示例,但我希望您能明白重点)
Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException

    End Sub

您可以在项目选项中找到应用程序事件。

1

你应该只捕获那些你能够处理的异常。

这是一个经验法则。我通常在我的Program.Main周围放置一个try/catch块,以防万一异常冒泡到顶部并需要记录。如果你正在使用多线程,你也可以处理CurrentDomain_UnhandledException事件,以防异常被抛出到UI线程之外的其他线程。


1
针对“4. 有其他建议吗?”:
在您的示例代码中,在记录异常之前会显示一个消息框。我建议在显示消息之前记录异常,以防用户看到错误消息后惊慌失措,然后在没有点击“确定”按钮的情况下离开度假。这只是小事情,但消息框会无限期地阻止程序运行,因此应谨慎使用!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接