应用程序不会因未处理的异常而崩溃?

4
如果我的应用程序遇到无法处理的异常,我希望它向用户显示一个错误消息并退出。问题在于,用户会看到一个异常对话框,其中包含详细信息、继续和退出等选项,如果用户点击“继续”,应用程序将保持在某种状态下,这不是我想要的。
为了用最少的代码复制这个问题,我只创建了一个 Windows Forms 应用程序,添加了一个按钮,并为按钮单击事件编写了以下代码:
throw new ApplicationException("I must crash now!!!");

当从Debug文件夹、Release文件夹启动编译后的exe文件,或者从其他地方复制Release文件夹中的exe文件启动(如果pdb文件引起问题),并单击按钮时,会显示详细信息/继续/退出对话框,如果选择继续,则应用程序将保持活动状态。如何防止出现“继续”选项?
我在我的计算机上(Vista,Visual Studio 2008,Visual Studio 2010,使用VS2010创建测试应用程序)以及用户计算机(Windows 7)上都有这种行为。
2个回答

5

是 Windows Forms 捕捉异常并显示对话框,而这正是您想要避免的。您可以使用 Application.SetUnhandledExceptionMode 方法配置 Windows Forms,使其不执行此操作。


如果我将其设置为UnhandledExceptionMode.ThrowException,那么它可以工作,所以看起来Windows Forms正在“处理未处理的异常”。在.Net中,为什么继续是未处理异常的默认选项的基本原理是什么? - user755327
@user755327:Windows Forms 的设计师可能更能回答关于这个决定的问题,但是带有“继续”和“退出”按钮的对话框一直存在于 Windows Forms 中。这是一个 Windows Forms 特有的功能,而不是 .NET 的特性。 - Martin Liversage

3
你需要为AppDomain.UnhandledException事件编写一个事件处理程序,在其中向用户显示更友好的错误消息。

http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

请记住,Exception可能意味着系统处于未定义状态,因此即使您的错误对话框也可能无法显示......您需要能够优雅地崩溃。
在应用程序的起始点:
static void Main() {
    AppDomain currentDomain = AppDomain.CurrentDomain;
    currentDomain.UnhandledException += errorHandler;
    // Then start your app!
}

static void errorHandler(object sender, UnhandledExceptionEventArgs args) {
    // Show the user some error, but be prepared for disaster...
    // Examine the args.ExceptionObject (which is an Exception)
}

我其实并不在意显示更好的错误信息,我只想确保应用程序百分之百会崩溃。我的问题是可用的“继续”选项。你提供的链接说:“它允许应用程序在系统默认处理程序报告异常并终止应用程序之前记录有关异常的信息。”但它并没有终止应用程序。 - user755327
我认为问题在于异常被 Windows Forms 处理,在这种情况下,UnhandledException 处理程序将不会被调用。 - Martin Liversage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接