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

前端之家收集整理的这篇文章主要介绍了delphi – 重新启动异常的费用是多少?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是
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(在异常被重新提出的情况下)

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

猜你在找的Delphi相关文章