多日来我一直在苦苦挣扎(但是徒劳无功)地处理异常掩码。
我开发了一个应用程序,可以在成千上万的记录上进行重型浮点计算。显然,代码必须能够处理异常,特别是与浮点计算相关的异常:Overflow、ZeroDivide等等。
该应用程序在Windows 7(32位或64位)下以许多不同类型的处理器运行,如果出现错误,则会正确处理条件,引发异常并丢弃记录。
不幸的是,当我在一个专用服务器上启动应用程序时,问题就开始了。该服务器使用英特尔Xeon E5-2640 v2 CPU和Windows Server 2003 R2操作系统。在这里,不会引发异常:具有错误的记录不会被丢弃,因此结果会受到机器所描述的数值“+INF”或“-INF”的污染。
问题在于,在服务器上,错误掩码的默认设置与我们在Windows 7中找到的不同。特别是,在服务器上调用
好了,别惊慌,我说,你只需(即在初始化部分中)调用
有人可以告诉我调用
为什么掩码默认值可能与计算机和另一个计算机不同呢?操作系统还是处理器类型?
谢谢。
我开发了一个应用程序,可以在成千上万的记录上进行重型浮点计算。显然,代码必须能够处理异常,特别是与浮点计算相关的异常:Overflow、ZeroDivide等等。
该应用程序在Windows 7(32位或64位)下以许多不同类型的处理器运行,如果出现错误,则会正确处理条件,引发异常并丢弃记录。
不幸的是,当我在一个专用服务器上启动应用程序时,问题就开始了。该服务器使用英特尔Xeon E5-2640 v2 CPU和Windows Server 2003 R2操作系统。在这里,不会引发异常:具有错误的记录不会被丢弃,因此结果会受到机器所描述的数值“+INF”或“-INF”的污染。
问题在于,在服务器上,错误掩码的默认设置与我们在Windows 7中找到的不同。特别是,在服务器上调用
GetExceptionMask
过程时,默认情况下我发现exZeroDivide
,而在Windows 7上调用GetExceptionMask
时,此异常未被屏蔽。结果就是我说的:在服务器上运行应用程序时,这些异常不会被引发,但由处理器处理,返回极端值和“污染”的数值。好了,别惊慌,我说,你只需(即在初始化部分中)调用
SetExceptionMask
,排除exZeroDivide
,但它无效。或者更好的是,尽管在调用SetExceptionMask
后,异常exZeroDivide
不再被屏蔽,但在执行带有浮点计算的代码时,由GetExceptionMask
返回的设置TArithmeticExceptionMask
仍包含exZeroDivide
,因此如果出现错误,则不会引发异常。有人可以告诉我调用
SetExceptionMask
的正确方法是什么吗?为什么掩码默认值可能与计算机和另一个计算机不同呢?操作系统还是处理器类型?
谢谢。