Delphi如何将异常处理作为长尾参数传递给过程实现高效的重构?

2026-04-10 17:032阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计595个文字,预计阅读时间需要3分钟。

Delphi如何将异常处理作为长尾参数传递给过程实现高效的重构?

这是重写创新并运行良好的示例:使用 `try` 和 `raise` 处理异常,例如:

csharptry{ raise Exception.Create('Exception msg');}catch (on E: Exception){ if (not (e is EConvertError)) { raise; }}end// 这是我的自定义方法 // 使用fib

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

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) – >例外 – >错误信息

当我改变最后一行时,这段代码运作良好

else raise e;

(1) – > EConvertError – >错误信息

(2) – > EConvertError – >错误信息

Delphi如何将异常处理作为长尾参数传递给过程实现高效的重构?


我收到“模块’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. 您遇到的问题是,如果在except块中捕获到异常,则“end”将释放您刚刚引发的异常实例.所以下一个except块将捕获已经发布的Exception实例.但是你可以通过调用AcquireExceptionObject来防止这种情况,这会使你成为异常实例的所有者.

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

本文共计595个文字,预计阅读时间需要3分钟。

Delphi如何将异常处理作为长尾参数传递给过程实现高效的重构?

这是重写创新并运行良好的示例:使用 `try` 和 `raise` 处理异常,例如:

csharptry{ raise Exception.Create('Exception msg');}catch (on E: Exception){ if (not (e is EConvertError)) { raise; }}end// 这是我的自定义方法 // 使用fib

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

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) – >例外 – >错误信息

当我改变最后一行时,这段代码运作良好

else raise e;

(1) – > EConvertError – >错误信息

(2) – > EConvertError – >错误信息

Delphi如何将异常处理作为长尾参数传递给过程实现高效的重构?


我收到“模块’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. 您遇到的问题是,如果在except块中捕获到异常,则“end”将释放您刚刚引发的异常实例.所以下一个except块将捕获已经发布的Exception实例.但是你可以通过调用AcquireExceptionObject来防止这种情况,这会使你成为异常实例的所有者.

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