情况: 我有一个在硬盘上增长的列表,我想将其加载到内存中进行处理。在某些时候,我会得到EOutofMemory。我需要的是一种测试我的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}
end;
end; // the try block
end;
我需要的是调用异常块而不实际等待满足内存不足的情况。我已经看过加注了,而且我找不到任何能够以我需要的方式提出异常的东西。
raise EOutofMemory;
无法编译。
raise;
编译但提出了什么?
raise EOutofMemory.NewInstance;
编译,但我想知道它后面的对象是做什么的?它会在我离开错误处理块,留在堆中或者编译器决定用它做什么的时候被销毁吗?
断言不允许指定任何内容;无论如何,它不是它的目标。
答案 0 :(得分:7)
由于在内存不足时没有足够的内存来创建异常,因此EOutOfMemory
的内存在启动时已预先分配。您使用它而不是创建一个新的。正如documentation
所述:
永远不要直接提升EOutOfMemory。相反,打电话给全球 OutOfMemoryError程序。
Try
OutOfMemoryError;
except
on EOutofMemory do
begin
{error handling code to be tested}
end;
end; // the try block
答案 1 :(得分:1)
raise操作符会生成异常。 异常是一个对象描述错误的情况。 如果你想提出异常,你应该准备它。至少你应该填写一条错误信息。
var
E: Exception;
begin
E := Exception.Create('Error message');
raise E;
end;
您应该使用Create而不是NewInstance。
EOutOfMemory是一个类。提出一个类是不可能的,而是一个类实例。您可以创建EOutOfMemory的实例。
raise EOutOfMemory.Create;
但是,Sertac Akyuz写道,这是不可能的。
空的 raise 运算符重新引发已捕获的异常实例而不进行任何更改。看看:
try
except
on E: EOutOfMemory do
begin
E.Message := 'Oops!';
raise E;
end;
on EOSException do
raise;
end;