如何捕获 GUI 线程中的异常?

发布于 2024-09-24 22:52:53 字数 177 浏览 3 评论 0原文

基于图片框的用户控件中引发异常,导致其显示典型的错误图像(红色 X)。由于GUI线程本身捕获并处理了异常,因此我无法轻松找出异常发生的位置并进行调试。

我目前正在将整个 OnPaint 代码包装在 try-catch 中,并且能够调试代码,但我发现它非常乏味,所以我想知道是否有一种方法可以从 GUI 线程异常中断到调试器。

An exception is thrown in a user control based on a picture box, causing it to show the typical error image (red X). Since the GUI thread caught and handled the exception itself, I cannot easily find out where the exception occurred and debug.

I'm currently wrapping the whole OnPaint code in a try-catch, and was able to debug the code, but I found it quite tedious so I wondered if there is a way to break into debugger from a GUI thread exception.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

剩一世无双 2024-10-01 22:52:53

默认情况下它已经以这种方式工作。 UI线程异常处理方法由Application.SetUnhandledExceptionMode()控制。默认值为 UnhandledExceptionMode.CatchException,以便引发 ThreadException 事件,并默认创建 ThreadExceptionDialog。

但是,如果附加了调试器,则会覆盖此模式。因此,如果没有活动的 catch 子句,异常将始终未被处理。这样调试器就会停止,以便您诊断问题。通过编写自己的 try/catch,可以防止此操作发生。

请注意 OnPaint() 可能比较特殊,特别是对于 PictureBox。它有一个 try/catch 子句,捕获未处理的异常并绘制红叉。这有点不寻常,但却是必要的,因为它支持 ImageLocation 属性。这使得它可以显示来自可能不可靠的网络源的图像。在这种情况下,解决异常的最佳方法是使用“调试 + 异常”,勾选“抛出”复选框。这会强制调试器始终在出现异常时停止,即使该异常未被处理。

It already works this way by default. The UI thread exception handling method is controlled by Application.SetUnhandledExceptionMode(). The default is UnhandledExceptionMode.CatchException so that the ThreadException event is raised and, by default, creates a ThreadExceptionDialog.

However, if a debugger is attached then it overrides this mode. So that an exception will always be unhandled if there is no active catch clause. So that the debugger will stop, allowing you to diagnose the problem. By writing your own try/catch, you prevent this from working.

Do beware that OnPaint() can be special, particularly for PictureBox. It has a try/catch clause, catching an unhandled exception and painting a red cross. This is a bit unusual but necessary because it supports the ImageLocation property. Which lets it display images from a potentially unreliable network source. The best way to trouble-shoot exceptions in that case is with Debug + Exceptions, tick the Thrown checkbox. This forces the debugger to always stop on an exception, even if it isn't unhandled.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文