【问题标题】:Catch all exception in C# winform application捕获 C# winform 应用程序中的所有异常
【发布时间】:2019-03-02 18:23:01
【问题描述】:

在 C# winform 桌面应用程序中,我试图捕获所有可能出现在代码中的异常,我已经尝试过:

  using System;
    using System.Threading;
    using System.Windows.Forms;

    namespace Controller
    {
        static class Program
        {
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
                Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
                AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

                Application.Run(new Form1());
            }

            static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
            {
                MessageBox.Show(e.Exception.Message, "Unhandled Thread Exception");
            }

            static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                MessageBox.Show((e.ExceptionObject as Exception).Message, "Unhandled UI Exception");           
            }
        }
    }

我在设备管理器中使用没有串行端口的表单关闭事件附加“COM6”来测试它,但我只看到 Visual Studio An exception of type 'System.InvalidOperationException' occurred in System.dll but was not handled in user code 报告

如何为 winform 应用程序收集错误数据

【问题讨论】:

  • 一旦遇到未处理的运行时错误,执行就会停止。除非您报告错误并让它继续运行,否则您不会看到任何其他错误,因为应用程序已停止运行。

标签: c# winforms exception events error-handling


【解决方案1】:

这实际上并不难做到。
我建议将用于处理异常的任何代码放入主窗体中,以保持program.cs 尽可能干净。

首先在你的Program.cs 中放这个

static class Program
{
    public static Form MainForm = null;

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Application.ThreadException += Application_ThreadException;
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

        MainForm = new Form1();
        Application.Run(MainForm);
    }

    static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
        ((Form1)MainForm).Application_ThreadException(sender, e);
    }
}

然后在你的主窗体中放这个

    public void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
    {
        // All unhandled exceptions will end up here, so do what you need here

        // log the error
        // show the error
        // shut the application down if needed
        // ROLLBACK database changes 
        // and so on...
    }

【讨论】:

  • 您好,我已经尝试过了,但同样如此,我只看到 Visual Studio 报告有异常情况,例如 An exception of type 'System.InvalidOperationException' occurred in System.dll but was not handled in user code 具有相同的串行端口测试和 MessageBox.ShowApplication_ThreadException 内,我已添加低于public Form1()Form1.cs
  • 这只会捕获未处理的异常。库可能会捕获异常并使用 messagebox.show 显示此信息。在这种情况下,您将永远不会再捕获它,因为它已经在其他地方捕获了
  • 到处寻找解决方案。这效果很好!
【解决方案2】:

您可以使用 try-catch 来捕获所有方法中的异常。在 catch 中,您可以记录异常的原因。

try
{
   // Your code that might throw an error
}
catch( Exception e )
{
   // What you want to do when the error is thrown
   Logger.WriteException(e);
}

我更喜欢编写静态类“Logger”和“WriteException”方法来将异常记录到文本文件中。

public static class Logger
{
    public static void WriteException(Exception exception)
    {
        string filePath = @"D:\Error.txt";

        using (StreamWriter logWriter = new StreamWriter(filePath, true))
        {
            logWriter.WriteLine("Message :" + exception.Message + "<br/>" + Environment.NewLine + "StackTrace :" + exception.StackTrace +
               "" + Environment.NewLine + "Date :" + DateTime.Now.ToString());
            logWriter.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine);
        }
    }
}

有几种可用的错误记录方法,您可以使用适合您应用程序的一种。您可以使用 EventLog、Microsoft Logger 等。

【讨论】:

  • 您好,是的,这样我就可以为每个特定的异常情况存储数据,但我想知道,是否有可能为任何其他可能的情况获取带有通用报告的单个事件,无论是否提供每个单独的异常条件提供的已经存在于单独的函数中
【解决方案3】:

在您的应用程序中单点捕获所有错误并不是最佳实践。我建议你找出你的代码可能失败的地方,然后使用 try/catch 块来捕获特定的错误组。通过这种方式,您可以更好地控制您的应用程序,并且您可以更好地识别代码的弱点。例如:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) {

    try{
      //Put here your code
    }
    catch{
    }
}

一个通用的“异常”肯定不能帮助您或用户识别应用程序中可能存在的错误

【讨论】:

  • 您好,是的,我对任何可能的情况都使用异常捕获,但是如果可以获取所有情况的通用报告,那么消息内容究竟应该是什么,如何处理此事件
猜你喜欢
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 2014-11-29
  • 2018-04-03
  • 2010-11-10
  • 1970-01-01
相关资源
最近更新 更多