gpt4 book ai didi

c# - 为什么我的应用程序在出现未处理的异常后不会停止?

转载 作者:太空宇宙 更新时间:2023-11-03 22:33:55 25 4
gpt4 key购买 nike

我想了解当我的应用程序崩溃时 Windows 事件日志是如何工作的,所以我添加了一个测试按钮来throw new Exception()。令我惊讶的是,该应用程序一直在运行。 Windows 显示一个对话框,其中包含继续或退出选项,然后单击继续,该应用程序将继续运行。我预计该应用会在出现未处理的异常后继续运行后崩溃。

大多数关于此主题的博客都使用一个小型控制台应用程序进行测试,该应用程序可以除以零,但我认为创建一个小型表单应用程序并不会增加太多麻烦。在现实世界中,我需要了解我的 Forms 应用程序的行为方式。下面是带有两个按钮的代码:一个用于更新时间显示,以证明应用确实在运行,另一个用于抛出未处理的异常。

using System.Windows.Forms;

namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
label_Msg.Text = DateTime.Now.ToString();
}

private void button_CrashNow_Click(object sender, EventArgs e)
{
throw new DivideByZeroException("This is Sandbox Crash Test");
label_Msg.Text = DateTime.Now.ToString();
}

private void button_UpdateTime_Click(object sender, EventArgs e)
{
label_Msg.Text = DateTime.Now.ToString();
}
}
}

在 VS2017 调试器中使用 F5 运行它将在异常处停止。继续使用 F5 将结束应用程序。

但是从 bin/debug 文件夹运行它,通过双击 .exe 文件,应用程序不会停止或退出,无论我点击 CrashNow 按钮的频率如何。通过单击“更新”按钮,时间显示会更新,就好像没有发生异常一样。

未处理的异常所做的唯一事情是该按钮的时间更新不起作用。

这怎么可能?


顺便说一句,我的问题不是关于 difference between Application.ThreadException and AppDomain.CurrentDomain.UnhandledException 的。事实上,我从未听说过那些异常(exception)。我的问题也不在于必须处理这两个异常。我的问题和另一个问题似乎提到了相同的 Application.SetUnhandledExceptionMode() 方法。这无疑是一种有趣的方法。在我看来,我的问题不是重复的。但是,指向其他问题的链接可能有助于更深入地了解 WinForm 引擎盖下发生的事情。

最佳答案

看完ms doc on the link根据 steve16351 的评论建议,我了解到 Windows 窗体应用程序有一个默认的异常处理程序。

在 Program.cs 中创建表单之前禁用该处理程序:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);

未处理的异常将导致不同的窗口对话框,带有选项

  • 在线检查解决方案并关闭程序
  • 关闭程序
  • 调试程序

所以现在无法继续使用“更新”按钮。

PS:我很遗憾看到他在我想投票之前删除了他的评论


更新:

这个问题听起来多么愚蠢,事实证明,如果您正在考虑使用 Program.cs 中的 try-catch block 捕获 WinForms 应用程序的所有异常,则此设置是必不可少的。如果没有此设置,则只有在 VS 调试器中运行时才会在此类 block 中捕获窗体中的异常,而不是在资源管理器窗口中双击 *.exe。

在表单中抛出的异常如果未在表单中捕获,则显然被视为未处理。您可能会尝试在创建表单的 Program.cs 中捕获它,但默认的应用程序处理程序可能会先捕获它。奇怪但真实:-)

关于c# - 为什么我的应用程序在出现未处理的异常后不会停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56043973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com