这是重新引发异常并运行良好的示例。
try
raise Exception.Create('Exception msg');
except
on E: Exception do
begin
if not(e is EConvertError) then
raise; // re-raise exception
end;
end;这是我的Custemize方法
// 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)->Exception ->错误消息
当我像这段代码一样修改最后一行时,效果很好。
else
raise e;(1)->EConvertError ->错误消息
(2)->EConvertError ->错误消息
但我得到的是“模块'Test.exe‘中地址00405F04的访问违规。请阅读地址00000000。”事后消息
如何引发与基本异常相同的异常类型
解决方案是“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.发布于 2012-06-14 13:25:18
您面临的问题是,如果一个异常被捕获在一个end块中,那么"end“将释放您刚刚引发的异常实例。因此,下一个next块将捕获已经释放的异常实例。但是,您可以通过调用AcquireExceptionObject来防止这种情况,这使您成为异常实例的所有者。
因为您“不能”使用raise; (System.@RaiseA增益),所以您可以使用raise AcquireExceptionObject;抛出相同的异常实例
https://stackoverflow.com/questions/11033177
复制相似问题