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

时间:2009-11-17 15:30:12

标签: c# exception-handling

我读了很多关于捕捉基数异常的错误,我不得不承认我也这样做了:

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

现在我想做对,并对此有一些疑问:

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

6 个答案:

答案 0 :(得分:7)

  1. 抓住您可以合理处理的任何例外情况。例如,如果您尝试打开文件进行写入,则应该预期文件可能标记为只读,因此会引发异常。但是在相同的情况下,你不会试图捕获一个null参数异常,因为这可能是程序员错误造成的。

  2. 它们应该在MSDN的函数参考中找到(你必须在每一个上查找它)。对于用户定义的函数,除非有其他文档或摘要注释,否则您将不得不进行挖掘。

  3. 3,4。考虑使用logging library for .NET

答案 1 :(得分:5)

我有一件事要补充。如果您只想在不影响程序流的情况下记录异常,则可以始终执行此操作:

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

   throw;
}

答案 2 :(得分:2)

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

答案 3 :(得分:2)

您可以在应用程序事件文件

中为未处理的异常设置事件

(这里有一个VB样本,但我希望你明白这一点)

Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException

    End Sub

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

答案 4 :(得分:1)

你应该只捕捉你可以做的事情,真的。

这是经验法则。我通常会在我的Program.Main周围进行try / catch,以防异常冒泡到顶部并需要记录。您还可以处理CurrentDomain_UnhandledException事件,以防在UI线程之外的其他线程中抛出异常(假设您是多线程)。

答案 5 :(得分:1)

回应“4.还有其他任何建议吗?”:

在示例代码中,在记录异常之前会显示一个消息框。我建议在显示消息之前记录异常,以防万一用户看到错误消息,恐慌,并在没有单击“确定”的情况下去度假。这是一个小问题,但是消息框会无限期地阻止程序,应该谨慎使用!