由于我在使用TWebBrowser和TEmbeddedWB时偶尔会收到“浮点除以零”异常,我发现我需要掩盖除以零异常Set8087CW或SetMXCSR。
问题1:最佳方法是什么:
- 在应用程序启动时尽早屏蔽这些异常,然后永远不再触及它们(该应用程序是多线程的)?
- 使用
OnBeforeNavigate
和OnDocumentComplete
事件来屏蔽/取消屏蔽异常? (文档加载后是否可能出现异常?)
问题2:屏蔽仅“除以零”,而不屏蔽其他内容的最佳“命令” - 如果应用程序是32位,则是否需要屏蔽64位异常?
我正在使用的应用程序始终可用TWebBrowser控件来显示电子邮件内容。
此外,如果有人可以澄清 - 这是微软的TWebBrowser控件的特定错误还是Delphi / C ++ Builder和Microsoft工具之间的差异?如果在Visual C ++应用程序中托管TWebBrowser并出现除以零错误会发生什么 - 它不会被转换为异常,但然后会发生什么 - Visual C ++如何处理“除以零”异常?
这有点奇怪,因为微软很长一段时间没有注意到这个问题 - 而且Embarcardero也没有注意到。因为有效地屏蔽浮点异常也会屏蔽该特定目的下的程序异常。
更新
经过一些检查,我的最终解决方案是:
SetExceptionMask(GetExceptionMask() << exZeroDivide);
默认情况下从GetExceptionMask()返回:
TFPUExceptionMask() << exDenormalized << exUnderflow << exPrecision
。很明显,有一些异常已经被屏蔽了——这只是将exZeroDivide
添加到屏蔽的异常中。因此,每次零除法现在都会产生浮点数中的+INF而不是异常。我可以接受这种情况——对于代码的生产版本,它将被屏蔽以避免错误;而对于调试版本,它将被取消屏蔽以便检测浮点数除以零。
TEmbeddedWB
中遇到了错误,但这种情况很少发生。问题不在于该组件,而是底层的TWebBrowser
。人们可以在各种情况下重现它(通过单击滚动条,仅通过加载内容等)。 - Coder12345