gpt4 book ai didi

c# - 我怎样才能让 WinForms 停止默默地忽略未处理的异常?

转载 作者:IT王子 更新时间:2023-10-29 04:08:15 25 4
gpt4 key购买 nike

这变得非常恼人。现在我有一个 winforms 应用程序,事情运行不正常,但据我所知没有抛出异常。在遍历了几乎所有相关代码之后,我发现在我的应用程序开始时抛出了一个异常。

长话短说,在 WinForms 中,即使发生异常,WinForms 库也会忽略它。不会抛出“发生未处理的异常”JIT 消息,它只是停止处理当前事件并返回到 GUI。

这会导致随机错误,因为加载数据之前发生的异常不会调用加载数据的代码。

为了查看实际效果,我创建了一个全新的 WinForms 应用程序,并输入了以下代码:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
string blah = null;
blah.Trim();
}
}

按 F5 键,即使抛出空引用,表单也会加载而不会显示任何错误。

然后我尝试转到我的 Program.cs 主方法并向其中添加 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);。我的表单仍然加载而没有导致抛出任何错误。

尽管我知道我可以告诉 VS 中断所有异常,但我发现这种情况真的很糟糕。它会导致非常奇怪的问题,很难在生产中进行调试,而且由于这是一个内部工具,我真的很想拥有它,以便在发生异常时它实际上会出错,而不是默默地忽略它。

有人知道怎么做吗?


更新:只是为了更新我从评论中学到的东西。

这似乎是 Windows 的 64 位问题,正如我从 this question 中了解到的那样我在发布之前没有看到。在那个问题中它指向一个 Microsoft bug report关于这个,有这样的话:

Hello,

This bug was closed as "External" because this behavior results from how x64 version of Windows handle exceptions. When a user mode exception crosses a kernel transition, x64 versions of Windows do not allow the exception to propagate. Therefore attached debuggers are unaware of the fact that an exception occured resulting in the debugger failing to break on the unhandled exception.

Unfortunately where is nothing that the Visual Studo team can do to address this, it is the result of operating system design. All feedback regarding this issue should be addressed to the Windows team; however the Windows team considers this to be the "correct" operating system design, and considers the x86 behavior to be "incorrect".

Best Regards, Visual Studio Debugger

也就是说,如果您的 中有以下代码,构建不通过 visual studio 运行(或使用 Ctrl+F5 运行)似乎会显示 JIT 异常消息框 EXCEPT程序.cs:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);

该代码将导致 Windows 忽略异常。

但是,如果您(改为)订阅 Application.ThreadException 事件,不仅您的异常会被捕获,visual studio 的调试器也会在未处理的异常上中断!

最佳答案

在您的 Program.cs 的 Main 函数中,您还应该确保您已将打开表单的调用包装在 try/catch 中。另外使用 AppDomain.UnhandledException 来捕获异常。我们还添加了 Application.ThreadException

我相信下面的内容会让你了解所有可能抛出的异常......

static void Main()
{
try
{
System.Windows.Forms.Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
System.Windows.Forms.Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(OnGuiUnhandedException);
AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;

var form = new MainForm();
form.ShowDialog();
}
catch (Exception e)
{
HandleUnhandledException(e);
}
finally
{
// Do stuff
}
}

private static void HandleUnhandledException(Object o)
{
// TODO: Log it!
Exception e = o as Exception;

if (e != null)
{

}
}

private static void OnUnhandledException(Object sender, UnhandledExceptionEventArgs e)
{
HandleUnhandledException(e.ExceptionObject);
}

private static void OnGuiUnhandedException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
HandleUnhandledException(e.Exception);
}

关于c# - 我怎样才能让 WinForms 停止默默地忽略未处理的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7572995/

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