这是
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(在异常被重新提出的情况下)
所以有一个区别.一个小的,但仍然在那里.