c# - 在 Try/Catch 中处理 Application.ThreadException 和包装 Application.Run 之间的区别

标签 c# winforms exception

是否有任何理由更喜欢在 Windows 窗体应用程序中实现全局异常处理程序的这些方法中的一种而不是另一种?

第一种方法

static void Main(string[] args) 
{
    try
    {
        System.Windows.Forms.Application.Run(mainform);
    }
    catch (Exception ex)
    {
        // Log error and display error message
    }
}

第二种方法

static void Main(string[] args) 
{
    System.Windows.Forms.Application.ThreadException += 
        new ThreadExceptionEventHandler(Application_ThreadException);
    System.Windows.Forms.Application.Run(mainform);
}

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
    // Log error and display error message
}

处理 ThreadException 事件是否为您提供了 try/catch 没有的东西?

最佳答案

我对这种行为的理解是添加 ThreadException处理程序将导致表单中未处理的异常被此处理程序捕获和处理,这将允许应用程序继续运行。

在您的 try/catch 设计中,表单中第一个未处理的异常将导致应用程序停止。您将捕获异常,但应用程序随后将结束。

请注意,还有一个 AppDomain.UnhandledException在某些情况下会引发的事件(主窗口窗体线程以外的线程中未处理的异常并且未捕获 ThreadException),所有这些对您的应用程序来说都是非常糟糕的消息。

关于c# - 在 Try/Catch 中处理 Application.ThreadException 和包装 Application.Run 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8452639/

相关文章:

c# - 具有基于 XML 的存储的 WCF 服务。并发问题?

c# - 如何在 Visual Studio 中打开现有的 azure 函数?

c# - 在 C# Winforms 应用程序中提供 "Paste Link"功能

c# - 自定义 DataGridView 重复列

c# - 如何在 C# 中获取目录大小(目录中的文件)?

python - 在异步收集中捕获异常

java - JPA:获取引用另一个实体的异常

c# - 用于开发的假 ssl 证书

c# - 将文件上传到 Hbase HDInsight

c++ 程序在一个线程发生访问冲突时终止 - 如何在 linux 中捕获此问题 - 对于 win32 我在 vs2010 中获得堆栈跟踪