我如何提出一个SILENT致命异常delphi

时间:2018-04-20 16:30:53

标签: delphi exception

情况: 我有一个在硬盘上增长的列表,我想将其加载到内存中进行处理。在某些时候,我会得到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; 

编译,但我想知道它后面的对象是做什么的?它会在我离开错误处理块,留在堆中或者编译器决定用它做什么的时候被销毁吗?

断言不允许指定任何内容;无论如何,它不是它的目标。

2 个答案:

答案 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;