我有一个从Program.cs开始的winforms,我们在那里定义了application.Winforms ()。我已经把这段代码放在了Program.cs块中。
[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)在最高级别捕获异常是一种好的做法吗?
发布于 2009-07-30 09:30:45
EDIT:正如Pratik指出的,以下答案仅适用于.NET 1.0和.NET 1.1。从CLS2.0开始,非.NET异常应该被捕获为RuntimeWrappedException。
因为Win32异常不是从.NET Exception类派生的。尝试:
try {
} catch (Exception ex) {
// .NET exception
} catch {
// native exception
}有关详细信息,请参阅Catch non-CLSCompliant exceptions in general handlers。
发布于 2009-07-30 09:22:43
Application.Run的执行没有抛出错误。这发生在另一个线程上(或者至少是异步的)。
在应用程序完全消失之前,以友好的方式通知用户应用程序已经失败,这是一个好主意,但是,仅仅捕获然后继续并不是一个好主意。
发布于 2009-07-30 09:42:56
虽然我不知道为什么catch块不能工作,但可以尝试使用Application ThreadException Event。这应该可以捕获应用程序线程中的任何错误。在调用Application.Run之前添加事件处理程序。
对于你的第二个答案,肯定是肯定的。我开发和维护了一个企业winforms应用程序,它在后台线程上与web服务后端通信。如果任何them服务调用崩溃处理应用程序线程异常(以及appdomain unhandledexception)事件,记录并弹出一个错误,业务用户可以报告并允许他们在不崩溃应用程序的情况下继续操作。
https://stackoverflow.com/questions/1205426
复制相似问题