首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么c#异常处理机制不能捕获win32异常

为什么c#异常处理机制不能捕获win32异常
EN

Stack Overflow用户
提问于 2009-07-30 09:17:35
回答 6查看 12.2K关注 0票数 14

我有一个从Program.cs开始的winforms,我们在那里定义了application.Winforms ()。我已经把这段代码放在了Program.cs块中。

代码语言:javascript
运行
复制
 [STAThread]
    static void Main()
    {
        try
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new frmSplash());
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            if (ex.InnerException != null)
            {
                MessageBox.Show(ex.InnerException.ToString());
            }
        }
    }

每当出现win32异常时,此机制就会失败,并抛出未处理的异常消息,应用程序崩溃。

关于这段代码,我有两个问题:

1)为什么没有捕获到win32异常。

2)在最高级别捕获异常是一种好的做法吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-07-30 09:30:45

EDIT:正如Pratik指出的,以下答案仅适用于.NET 1.0和.NET 1.1。从CLS2.0开始,非.NET异常应该被捕获为RuntimeWrappedException

因为Win32异常不是从.NET Exception类派生的。尝试:

代码语言:javascript
运行
复制
try {
} catch (Exception ex) {
    // .NET exception
} catch {
    // native exception
}

有关详细信息,请参阅Catch non-CLSCompliant exceptions in general handlers

票数 17
EN

Stack Overflow用户

发布于 2009-07-30 09:22:43

Application.Run的执行没有抛出错误。这发生在另一个线程上(或者至少是异步的)。

在应用程序完全消失之前,以友好的方式通知用户应用程序已经失败,这是一个好主意,但是,仅仅捕获然后继续并不是一个好主意。

票数 3
EN

Stack Overflow用户

发布于 2009-07-30 09:42:56

虽然我不知道为什么catch块不能工作,但可以尝试使用Application ThreadException Event。这应该可以捕获应用程序线程中的任何错误。在调用Application.Run之前添加事件处理程序。

对于你的第二个答案,肯定是肯定的。我开发和维护了一个企业winforms应用程序,它在后台线程上与web服务后端通信。如果任何them服务调用崩溃处理应用程序线程异常(以及appdomain unhandledexception)事件,记录并弹出一个错误,业务用户可以报告并允许他们在不崩溃应用程序的情况下继续操作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1205426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档