C# 如何在Windows窗体应用程序中记录异常
我读了很多关于捕获基本异常有多糟糕的文章,我不得不承认我也这么做了:C# 如何在Windows窗体应用程序中记录异常,c#,exception-handling,C#,Exception Handling,我读了很多关于捕获基本异常有多糟糕的文章,我不得不承认我也这么做了: try{ ... } catch (Exception exception){ MessageBox.Show(exception.Message, "Error!"); MyLogger.Log(exception.Message); } 现在我想把它做好,并提出一些问题: 我应该捕获哪些异常(例如用于文件操作的FileNotExists,但是对于TableAdapter或ReportClass(C
try{
...
}
catch (Exception exception){
MessageBox.Show(exception.Message, "Error!");
MyLogger.Log(exception.Message);
}
现在我想把它做好,并提出一些问题:
你应该只捕捉你能做点什么的异常,真的 这是经验法则。我通常会对我的
程序.Main进行一次try/catch,以防异常冒泡到顶部并需要记录。您还可以处理CurrentDomain\u UnhandledException
事件,以防在UI线程以外的其他线程中引发异常(假设您是多线程)
捕获您可以合理处理的任何异常。例如,如果您试图打开一个文件进行写入,您应该预料到该文件可能被标记为只读,因此会引发异常。但在相同的情况下,您不会尝试捕获空参数异常,因为这是由于程序员错误造成的
它们应该在MSDN中的函数引用中找到(您必须在每个函数中查找)。对于用户定义的函数,除非有额外的文档或摘要注释,否则您必须进行挖掘
三,四。考虑使用< /P>
这取决于您决定您的应用程序逻辑可以合理地从哪些异常中恢复
异常是由方法调用而不是对象引发的。在VisualStudio中,Intellisense解释将告诉您对象引发了哪些异常(前提是XML文档描述了方法引发的哪些异常)
不要使用静态方法,而是响应Application.ThreadException事件。提供的链接有示例。
我有一件事要补充。如果您只想记录一个异常而不影响程序流,您可以随时这样做:
try
{
...
}
catch (Exception exception)
{
MyLogger.Log(exception.Message);
throw;
}
可以在应用程序事件文件中为未处理的异常设置事件
(这里有一个VB示例,但我希望您能理解)
您可以在项目的选项中找到应用程序事件。响应“4.还有其他建议吗?”:
在您的示例代码中,在记录异常之前会显示一个消息框。我建议在显示消息之前先记录异常,以防用户看到错误消息,惊慌失措,没有单击“确定”就去度假。这是一件小事,但是消息框会无限期地阻止程序,应该谨慎使用!我同意所有这些观点。我还要补充到第2点,对于您自己引发异常的方法,重要的是记录在何种情况下引发的异常,以便调用方知道如何处理它。有好的模式和pra吗未找到有关Windows窗体中的日志记录和异常(UnhandledException、Application.ThreadException事件
等)的操作(可能在MSDN-Microsoft中)
Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException
End Sub