当我不时使用 TWebBrowser 和 TEmbeddedWB 时收到“浮点除零”异常,我发现我需要屏蔽除零异常 Set8087CW 或 SetMXCSR。
Q1:执行此操作的最佳方法是什么:
- 在应用程序启动的早期屏蔽此类异常并且不再触摸它们(应用程序是多线程的)?
- 使用
OnBeforeNavigate
和OnDocumentComplete
事件来屏蔽/取消屏蔽异常?(加载文档后是否有可能发生异常?)
Q2:什么是仅屏蔽“除以零”而没有其他任何内容的最佳“命令” - 如果应用程序是 32 位,是否也需要屏蔽 64 位异常?
我正在使用它的应用程序具有 TWebBrowser 控件,可始终用于显示电子邮件内容。
此外,如果有人可以澄清 - 这是微软 TWebBrowser 控件的一个特殊错误,还是 Delphi/C++ Builder 和微软工具之间的区别?如果我将 TWebBrowser 托管在 Visual C++ 应用程序中,如果出现被零除错误会发生什么——它不会被转换为异常,但会发生什么——那么 Visual C++ 将如何处理“被零除”异常?
微软这么长时间都没有注意到这个问题有点奇怪——Embarcardero 也没有注意到这个问题也很奇怪。因为屏蔽浮点异常有效地也屏蔽了您自己的程序异常用于该特定目的。
更新
经过一番检查,我的最终解决方案是:
SetExceptionMask(GetExceptionMask() << exZeroDivide);
GetExceptionMask()的默认状态返回:TFPUExceptionMask() << exDenormalized << exUnderflow << exPrecision
。很明显,一些异常已经被屏蔽了——这只是增加exZeroDivide
了被屏蔽的异常。
因此,现在每个除以零都会导致+INF浮点数而不是异常。我可以忍受 - 对于代码的生产版本,它将被屏蔽以避免错误,而对于调试版本,它将被取消屏蔽以检测浮点除以零。