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

时间:2010-09-22 15:11:31

标签: .net winforms user-controls picturebox ui-thread

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

我目前正在将整个OnPaint代码包装在try-catch中,并且能够调试代码,但我发现它非常繁琐,所以我想知道是否有办法从GUI线程异常中闯入调试器。

1 个答案:

答案 0 :(得分:2)

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

但是,如果附加了调试器,则它会覆盖此模式。因此,如果没有活动的catch子句,则永远不会处理异常。这样调试器就会停止,允许您诊断问题。通过编写自己的try / catch,可以防止这种情况发生。

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