【发布时间】:2013-10-11 19:42:31
【问题描述】:
由于我在使用 TWebBrowser 和 TEmbeddedWB 时不时收到“浮点除零”异常,我发现我需要屏蔽除零异常 Set8087CW 或 SetMXCSR。
Q1:最好的方法是什么:
- 在应用程序启动的早期屏蔽此类异常并且不再接触它们(应用程序是多线程的)?
- 使用
OnBeforeNavigate和OnDocumentComplete事件来屏蔽/取消屏蔽异常? (文档加载后是否有可能发生异常?)
Q2:什么是仅屏蔽“除以零”而不屏蔽其他任何内容的最佳“命令” - 如果应用程序是 32 位,是否也需要屏蔽 64 位异常?
我正在使用它的应用程序有 TWebBrowser 控件可用于显示电子邮件内容。
另外,如果有人能澄清一下 - 这是 Microsoft 的 TWebBrowser 控件的特定错误,还是 Delphi/C++ Builder 和 Microsoft 工具之间的区别?如果我将 TWebBrowser 托管在 Visual C++ 应用程序中,如果出现除零错误会发生什么 - 它不会被转换为异常,但接下来会发生什么 - Visual C++ 将如何处理“除零”异常?
微软这么长时间都没有注意到这个问题有点奇怪——Embarcardero 也没有注意到这个问题也很奇怪。因为屏蔽浮点异常有效地也屏蔽了您自己的程序异常用于该特定目的。
更新
经过一番检查,我的最终解决方案是:
SetExceptionMask(GetExceptionMask() << exZeroDivide);
GetExceptionMask() 的默认状态返回:TFPUExceptionMask() << exDenormalized << exUnderflow << exPrecision。很明显,一些异常已经被屏蔽了——这只是将exZeroDivide 添加到被屏蔽的异常中。
因此,现在每个除以零的结果都是 +INF 浮点而不是异常。我可以忍受 - 对于代码的生产版本,它会被屏蔽以避免错误,而对于调试版本,它将被取消屏蔽以检测浮点除以零。
【问题讨论】:
-
try-except 有什么问题?
-
你能提供一个SSCE吗?我在各种应用程序中使用 EmbeddedWB,但我从未遇到过屏蔽异常的需要......
-
我在
TEmbeddedWB中遇到了错误,而且很少发生。问题不在于该组件,而在于底层TWebBrowser。人们可以在各种情况下重现它(通过单击滚动条,仅通过加载内容等)。 -
@whosrdaddy 在 SO 上关于这个主题有很多问题
-
embedding YouTube clips in the TWebBrowser 时我遇到了同样的问题。我最终掩盖了应用程序启动时的异常。从那以后,对我的申请没有(已知的)影响。
标签: delphi exception webbrowser-control c++builder twebbrowser