重新启动例外的成本是多少?

jpf*_*ius 12 delphi exception-handling delphi-xe

这是

try
  DoSomethingThatMightThrowAnException;
except
  on E : ESyntaxError do
    begin
    if (E.ErrorCode = errMissingBracket) then
      HandleError
    else
      raise;
    end;
end;
Run Code Online (Sandbox Code Playgroud)

比这慢?

try
  DoSomethingThatMightThrowAnException;
except
  on E : EMissingBracketSyntaxError do
    begin
    HandleError;
    end;
end;
Run Code Online (Sandbox Code Playgroud)

有什么不同的预期?有关系吗?请注意,这可能会通过调用堆栈多次发生.

Sti*_*ers 0

我快速浏览了编译器为上述代码片段生成的汇编程序。事实证明,紧随其后的字节jmp @HandleOnExeption包含数据,例如您在on子句中使用的异常类指针(如果有)。

我不太精通汇编程序,无法确切地知道发生了什么,但足以理解大致发生了什么并得出以下结论:

我怀疑 System.pas 的 HandleOnException 已经执行了call @IsClass,如果找不到合适的处理程序,则会传递异常,因此如果您使用on e:Exception并重新引发,这将添加一些代码并额外进行两次调用:

  • 返回到异常处理部分(在所有情况下)
  • 一个call @RaiseAgain(如果异常被重新引发)

所以,这是有区别的。一个小问题,但它仍然存在。