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

delphi – 重新启动异常的费用是多少?

发布时间:2020-12-15 03:34:03 所属栏目:大数据 来源:网络整理
导读:这是 try DoSomethingThatMightThrowAnException;except on E : ESyntaxError do begin if (E.ErrorCode = errMissingBracket) then HandleError else raise; end;end; 比这慢吗? try DoSomethingThatMightThrowAnException;except on E : EMissingBracketS
这是
try
  DoSomethingThatMightThrowAnException;
except
  on E : ESyntaxError do
    begin
    if (E.ErrorCode = errMissingBracket) then
      HandleError
    else
      raise;
    end;
end;

比这慢吗?

try
  DoSomethingThatMightThrowAnException;
except
  on E : EMissingBracketSyntaxError do
    begin
    HandleError;
    end;
end;

有什么区别?有关系吗?请注意,这可能会通过调用堆栈发生多次.

解决方法

我已经快速看看编译器为上面的代码片段发出的汇编程序.原来,jmp @HandleOnExeption之后的字节包含数据,例如在on子句(如果有的话)中使用的异常类指针.

我不是很精通汇编人员准确地知道发生了什么,而是足够了解大致的事情,并得出这样的结论:

我怀疑System.pas’HandleOnException已经调用了@IsClass,并且如果没有找到合适的处理程序,那么传递异常,所以如果你在e:Exception和re-raise上使用,这将添加一些代码,并进行两次调用:

>一个回到你的异常处理部分(在所有情况下)
>一个调用@RaiseAgain(在异常被重新提出的情况下)

所以有一个区别.一个小的,但仍然在那里.

(编辑:李大同)

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

    推荐文章
      热点阅读