Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Windows窗体应用程序中记录异常_C#_Exception Handling - Fatal编程技术网

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);
}
现在我想把它做好,并提出一些问题:

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

  • 你应该只捕捉你能做点什么的异常,真的

    这是经验法则。我通常会对我的
    程序.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