delphi - 异常消息从哪里来?

标签 delphi exception delphi-2007

当引发 EZeroDivideEOverflowEMathError... 等异常时,它们会显示一条默认消息。

例如,以下代码会引发带有以下消息的 EZeroDivide:

Floating point division by zero

procedure TForm1.Button1Click(Sender: TObject);
var
  N : Extended;
  D : Extended;
begin
  N := 100;
  D := 0;
  Caption := FloatToStr(N/D);
end;

EZeroDivide Floating point division by zero

当我通过代码“手动”引发 EZeroDivide 异常时,我必须将 Msg 参数传递给构造函数,并将其作为 EZeroDivide 有空字符串消息的异常:

procedure TForm1.Button2Click(Sender: TObject);
begin
  raise EZeroDivide.Create('');
end;

EZeroDivide without message

默认的异常消息从哪里来?

最佳答案

这些异常实例是由 RTL 在内部生成的。问题中的具体字符串可以在SysConst.pas的resourcestring部分找到

 SZeroDivide = 'Floating point division by zero';

RTL 在内部使用 Error 方法来引发此类异常。运行时错误的完整列表在以下枚举的 System 单元中定义:

TRuntimeError = (reNone, reOutOfMemory, reInvalidPtr, reDivByZero,
  reRangeError, reIntOverflow, reInvalidOp, reZeroDivide, reOverflow,
  reUnderflow, reInvalidCast, reAccessViolation, rePrivInstruction,
  reControlBreak, reStackOverflow,
  { reVar* used in Variants.pas }
  reVarTypeCast, reVarInvalidOp,
  reVarDispatch, reVarArrayCreate, reVarNotArray, reVarArrayBounds,
  reAssertionFailed,
  reExternalException, { not used here; in SysUtils }
  reIntfCastError, reSafeCallError,
  reMonitorNotLocked, reNoMonitorSupport
{$IF defined(LINUX) or defined(MACOS) or defined(ANDROID)}
  , reQuit
{$ENDIF LINUX or MACOS or ANDROID}
{$IFDEF POSIX}
  , reCodesetConversion
{$ENDIF POSIX}
  , rePlatformNotImplemented, reObjectDisposed
  );

如果您有真正的理由自己引发运行时错误,您可以通过调用来实现,例如:

 System.Error(reZeroDivide);

如果您非常细心,您会注意到 ErrorSystem 单元中没有前向声明,而仅存在于实现部分。通常,这会阻止您在其包含单元之外调用该方法,但 System 单元在很多方面都很特殊,并且该方法可以全局访问。请注意,您通常还会包含 Windows 单元,并且这会声明一个名为 ERROR 的常量,该常量通常会隐藏 System.Error,因此范围界定通常是明确需要的。

关于delphi - 异常消息从哪里来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54792566/

相关文章:

c# - 为什么那个异常管理代码很臭?

c++ - C++ 中的自定义异常

string - 查找字符串中最后一次出现的 char

delphi - 将 SysUtils.WrapText() 与包含单引号的字符串一起使用

delphi - 从Delphi 2007升级到Delphi 2010?

delphi - 如何在TCL中使用Delphi编译的DLL?

delphi - 是什么导致了 Delphi 中的内存泄漏?

delphi - Delphi 2010 与其他 Delphi 版本的稳定性、速度和帮助比较

delphi - CP_UTF8 是 WriteConsoleA/WriteFile 支持的代码页吗?

.net - 如何在Matlab中获取LoaderExceptions