Delphi 如何引发一个无声的致命异常
情况: 我有一个在硬盘上不断增长的列表,我想把它加载到内存中进行处理。总有一天,我会忘记的。我需要的是一种测试我的except块中的代码的方法:Delphi 如何引发一个无声的致命异常,delphi,exception,Delphi,Exception,情况: 我有一个在硬盘上不断增长的列表,我想把它加载到内存中进行处理。总有一天,我会忘记的。我需要的是一种测试我的except块中的代码的方法: implementation uses sysutils; function loadit(var F:File); begin Try {load list code} except on EOutofMemory do begin {error handling code to be tested}
implementation
uses sysutils;
function loadit(var F:File);
begin
Try
{load list code}
except
on EOutofMemory do
begin
{error handling code to be tested}
end;
end; // the try block
end;
我需要的是调用异常块,而不是真正等待内存不足条件得到满足。我已经查看了raise,但我没有发现任何允许以我需要的方式引发异常的内容
raise EOutofMemory;
不编译
raise;
编译但引发什么
raise EOutofMemory.NewInstance;
编译,但我想知道它之后对对象做了什么?它会在我离开错误处理块、留在堆中或者编译器决定用它做什么的时候被销毁吗
断言不允许指定任何内容;无论如何,这不是它的目标 由于内存不足时没有足够的内存创建异常,因此启动时会预先分配
EOutOfMemory
的内存。您可以使用它,而不是创建一个新的。作为缔约国:
永远不要直接唤起记忆。相反,打电话给全球
程序
raise操作符生成一个异常。 例外情况是对象描述了错误的情况。 如果你想引发一个异常,你应该准备它。至少您应该填写一条错误消息
var
E: Exception;
begin
E := Exception.Create('Error message');
raise E;
end;
您应该使用Create而不是NewInstance
记忆是一个类。不可能生成一个类,但可以生成一个类实例。您可以创建内存的实例
raise EOutOfMemory.Create;
但这不可能像塞塔克·阿库兹所写的那样
空的raise操作符重新引发已捕获的异常实例,而不做任何更改。看看:
try
except
on E: EOutOfMemory do
begin
E.Message := 'Oops!';
raise E;
end;
on EOSException do
raise;
end;
try
except
on E: EOutOfMemory do
begin
E.Message := 'Oops!';
raise E;
end;
on EOSException do
raise;
end;