所以我构建了这个简单的Web窗体应用程序:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
new Thread(new ThreadStart(throwException)).Start();
}
public static void throwException()
{
throw new Exception();
}
public static void UnhandledExHandler(object sender, UnhandledExceptionEventArgs t)
{
MessageBox.Show("This is exception is unhandled.");
}
}
static class Program
{
static void Main()
{
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(Form1.UnhandledExHandler);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
这个问题是在执行UnhandledExHandler
之后,Forms1()
构造函数没有返回但是继续抛出异常,我的意思是它一直在新线程上调用throwException()
。最终用户体验不断突然出现MessageBox
。我知道我必须在Application.Exit()
内拨打UnhandledExHandler
才能退出该应用。但这不应该在调用一次之后停止调用UnhandledExHandler
吗?
答案 0 :(得分:1)
假设您的所有项目都在同一个应用程序域中运行,这将正常运行。 我们将这个确切的代码封装在一个在众多应用程序之间共享的公共DLL中。
另一个建议:如果在Windows窗体应用程序中使用它,您可能还想为System.Windows.Forms.Application.ThreadException添加处理程序。
例如,当有人忘记向控件事件添加异常处理时,这可以作为一个支持。
答案 1 :(得分:1)
如果您在未经调试的情况下运行应用,则会收到一个消息框,您的应用将被关闭。由于调试器工作原因,您会看到许多msg框。
您的UnhandledExceptionEventArgs.IsTerminating
是true
,我猜您无法在CurrentDomain.UnhandledException
处理程序中执行任何操作。
但您可以在ThreadException
事件处理程序中处理它。