COM DLL中的EOverflow异常和+ INF

时间:2017-09-10 19:46:15

标签: delphi dll exception-handling infinity

在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,这使我有点厌倦应用它。

有什么想法或建议吗?在此先感谢您的考虑!

0 个答案:

没有答案