我正在使用第 3 方控件 (ComponentOne),我会间歇性地得到这个典型的红色 X 框,如这个典型的图像所示。起初我以为我有 GDI 泄漏,所以在做了一些腿部工作后,我确认我的 GDI 编号在绘制控件时没有问题。
在谷歌搜索后我发现这种错误发生在 OnPaint() 事件上,因此即使我在调用控件渲染时 try catch ,它也不会捕获它。
所以我的下一步是在我的代码中覆盖以下内容。
protected override void OnPaint(PaintEventArgs e)
{
try
{
base.OnPaint(e);
}
catch (Exception ex)
{
this.Invalidate(); //attempt to redraw the control
XmSam.Log(ex);
}
}
我认为这应该可以解决问题,但我不能一直重现这个问题,所以我还不能完全测试上面的代码。我的问题是,如果我呈现我的控件并且它有异常,那么这段代码将尝试重绘控件。这会陷入无限循环并卡住我的 UI 吗?还是您认为导致异常的任何原因都会消失,并且在第二次重绘控件时应该可以正常渲染?
最佳答案
I think that should do the trick
不,你让事情变得更糟了。现在您的 OnPaint() 方法一遍又一遍地运行,可能会反复遇到同一个异常。您也会看到您的程序也 100% 消耗了核心资源。
在 OnPaint() 中获得异常并不是您真正可以生存的事情。用户无需查看任何内容,这是有保证的支持电话。与其隐藏问题,不如使用异常找出实际出错的地方并修复问题。使用 Debug + Exceptions,勾选 CLR 异常的 Thrown 复选框,这样调试器将在引发异常时停止。以防万一,在框架代码中引发异常的可能性不大,还可以使用工具 + 选项、调试并取消选中“仅启用我的代码”选项。
关于c# - Winform 出现 Red X 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17927128/