在Delphi Seattle中,我有以下构造的计算函数:
try
result := ..... // calculation
except
// Handle (overflow) exception
end;
从EXE调用此函数,按预期工作,并捕获并处理溢出异常。但是,从COM DLL调用该函数时,异常不会被捕获。通过调试,我发现结果变为+ INF并且没有引发EOverflow异常(这在我的代码中有进一步的连锁反应)。
经过一些实验,我发现将函数更改为以下函数可以从COM DLL中运行:
try
result := ..... // calculation
if result = Infinity then
raise EOverflow.Create('Forced overflow');
except
// Handle (overflow) exception
end;
我想我可以用' if result = ...'代码在{$ IFDEF MYFLAG}块中,以便它只编译COM DLL(这可以作为快速修复),但我想知道是否有更优雅的解决方案。
在网上做一些研究,我遇到了使用SetExceptionMask或$ FINITEFLOAT编译器指令的建议。 SetExceptionMask看起来相当棘手(副作用?)和$ FINITEFLOAT似乎没有效果,我或多或少地预期,因为ON应该是默认值...
此外,所发现的建议都适用于较旧的(甚至是.NET)版本的Delphi,这使我有点厌倦应用它。
有什么想法或建议吗?在此先感谢您的考虑!