繁体   English   中英

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

[英]How to log exceptions in Windows Forms Application

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

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

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

  1. 我应该捕获哪些异常(例如FileNotExists用于文件操作,但是对于TableAdapter或ReportClass(CrystalReports))
  2. 我在哪里可以看到对象可以抛出的异常列表(例如TableAdapter)
  3. 在Windows窗体应用程序中,我可以设置静态方法,例如,将任何异常记录到文件中
  4. 还有其他建议吗?
  1. 抓住您可以合理处理的任何例外情况。 例如,如果您尝试打开文件进行写入,则应该预期文件可能标记为只读,因此会引发异常。 但在相同的情况下,您不会尝试捕获null参数异常,因为这可能是由于程序员错误。

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

3,4。考虑使用.NET日志库

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

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

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

您可以在应用程序事件文件中为未处理的异常设置事件

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

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

    End Sub

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

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

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

回答“4.还有其他建议吗?”:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM