首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在记录后重新引发Delphi异常?

如何在记录后重新引发Delphi异常?
EN

Stack Overflow用户
提问于 2010-05-28 01:08:56
回答 6查看 15.3K关注 0票数 26

你知道在Delphi代码中捕获、记录和重新引发异常的方法吗?一个简单的例子:

代码语言:javascript
复制
procedure TForm3.Button1Click(Sender: TObject);
begin
  try
    raise Exception.Create('Bum');
  except
    on E: Exception do
    begin
      MyHandleException(E);
    end;
  end;
end;

procedure TForm3.MyHandleException(AException: Exception);
begin
  ShowMessage(AException.Message);
  LogThis(AException.Message);  
  // raise AException; - this will access violate
end;

所以我需要在except块中重新引发它,但我想知道是否有更好的方法来编写我自己的方法来处理和(在特定条件下)重新引发异常。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-05-28 01:29:03

如果只想在某些情况下重新引发异常,请编写

代码语言:javascript
复制
procedure TForm3.Button1Click(Sender: TObject);
begin
  try
    raise Exception.Create('Bum');
  except
    on E: Exception do
    begin
      if MyHandleException(E) then
        raise;
    end;
  end;
end;

function TForm3.MyHandleException(AException: Exception): boolean;
begin
  ShowMessage(AException.Message);
  result := true/false;
end;
票数 35
EN

Stack Overflow用户

发布于 2012-05-03 13:15:40

在Craig Young的帖子之后,我已经成功地使用了以下代码。您可以通过在ExceptAddr函数中使用"at“标识符来保留原始异常位置。原始异常类类型和信息也会被保留。

代码语言:javascript
复制
procedure MyHandleException(AMethod: string);
var
  e: Exception;
begin
  e := Exception(AcquireExceptionObject);
  e.Message := e.Message + ' raised in ' + AMethod; 
  raise e at ExceptAddr;
end;

try
  ...
except
  MyHandleException('MyMethod');
end;
票数 11
EN

Stack Overflow用户

发布于 2010-05-28 01:15:09

您应该能够仅使用Raise命令本身来重新引发异常:

代码语言:javascript
复制
begin
  MyHandleException(E);
  Raise;
end;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2923230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档