当引发 EZeroDivide
、EOverflow
、EMathError
... 等异常时,它们会显示一条默认消息。
例如,以下代码会引发带有以下消息的 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
异常时,我必须将 Msg
参数传递给构造函数,并将其作为 EZeroDivide
有空字符串消息的异常:
procedure TForm1.Button2Click(Sender: TObject);
begin
raise EZeroDivide.Create('');
end;
默认的异常消息从哪里来?
最佳答案
这些异常实例是由 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);
如果您非常细心,您会注意到 Error
在 System
单元中没有前向声明,而仅存在于实现部分。通常,这会阻止您在其包含单元之外调用该方法,但 System
单元在很多方面都很特殊,并且该方法可以全局访问。请注意,您通常还会包含 Windows
单元,并且这会声明一个名为 ERROR
的常量,该常量通常会隐藏 System.Error
,因此范围界定通常是明确需要的。
关于delphi - 异常消息从哪里来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54792566/