Delphi 如何引发一个无声的致命异常

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}

情况: 我有一个在硬盘上不断增长的列表,我想把它加载到内存中进行处理。总有一天,我会忘记的。我需要的是一种测试我的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,但我没有发现任何允许以我需要的方式引发异常的内容

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;