gpt4 book ai didi

Delphi 重新引发异常(作为参数在过程中传递)

转载 作者:行者123 更新时间:2023-12-03 15:30:59 27 4
gpt4 key购买 nike

这是重新引发异常的示例并且运行良好

  try
raise Exception.Create('Exception msg');
except
on E: Exception do
begin
if not(e is EConvertError) then
raise; // re-raise exception
end;
end;

这是我的自定义方法

//    uses fib //fibplus  EFIBInterBaseError
procedure CustomizeException(e: Exception);
var
s: String;
begin
if E is EFIBInterBaseError then
begin
if Pos('unique',e.Message)>0 then
begin
s := 'record';
if Pos('CUSTOMMERS_IDX1',e.Message)>0 then
s:= 'Custommer Number';

raise TCustomizedException.CreateFmt('The %s is already exists.',[s]);
end
else
if Pos('</CMSG>',e.Message)>0 then
Begin
raise TCustomizedException.CreateFmt('%s',
[StrUtilsEx.GiveInTags(e.Message,'<CMSG>','</CMSG>')]
);
End
else
raise EFIBInterBaseError.CreateFmt('%s',[e.Message]);
end
else
raise Exception.Create(e.Message); //e;// e.Create(e.Message);
end;

但是

  try
raise EConvertError.Create('Error Message');
except on e : exception do
Begin
ShowMessage(Format('%s -> %s',[e.ClassName , e.Message])); //(1)
try
CustomizeException(e);
except on e2: Exception do
ShowMessage(Format('%s -> %s',[e2.ClassName , e2.Message])); //(2)
end;
End;
end;

结果

(1)->EConvertError -> 错误消息

(2)->异常 -> 错误消息

当我像这样更改最后一行时,这段代码运行良好

  else
raise e;

(1)->EConvertError -> 错误消息

(2)->EConvertError -> 错误消息

但是我收到“模块‘Test.exe’中地址 00405F04 处的访问冲突。读取地址 00000000。”消息后

如何引发与基本异常相同的异常类型

解决方案是raise TObject(AcquireExceptionObject);//<- 我想用“E :

来解决
type
ECustomizedException = class(Exception);
uses
fib,SysUtils,System


class procedure SystemEx.CustomizeException(E : Exception);
var
s: String;
begin
if E is EFIBInterBaseError then
begin
if Pos('unique',e.Message)>0 then
begin
s := 'Record';
if Pos('CUSTOMMER_IDX1',e.Message)>0 then
s:= 'Custommer';

raise ECustomizedException.CreateFmt('%s is already exists.',[s]);
end
else
if Pos('</CMSG>',e.Message)>0 then
Begin
raise ECustomizedException.CreateFmt('%s',
[StrUtilsEx.GiveInTags(e.Message,'<CMSG>','</CMSG>')]
);
End
else
raise EFIBInterBaseError.CreateFmt('%s',[e.Message]);
end
else
raise TObject(AcquireExceptionObject); //<- I would like to solve with "E : Exception" param
// raise Exception.Create(e.Message); //e;// e.Create(e.Message);// Exception.Create(E.Message);
End.

最佳答案

您面临的问题是,如果异常在 except block 中被捕获,“end”将释放您刚刚再次引发的异常实例。因此下一个 except block 将捕获已经释放的 Exception 实例。但是您可以通过调用 AcquireExceptionObject 来防止这种情况发生,这使您成为异常实例的所有者。

因为您“不能”使用 raise; (System.@RaiseAgain),所以您可以使用 raise AcquireExceptionObject; 抛出相同的异常实例

关于Delphi 重新引发异常(作为参数在过程中传递),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11033177/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com