加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi重新提升异常(作为参数传递给过程)

发布时间:2020-12-15 09:14:39 所属栏目:大数据 来源:网络整理
导读:这是重新引发异常并且运行良好的示例 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 EFIBInterBas
这是重新引发异常并且运行良好的示例

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


我收到“模块’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','</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抛出相同的异常实例;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读