导致代码跳跃的异常

use*_*495 -1 delphi exception-handling delphi-5

我正在使用D5和Synaps与OpenSSL,它工作得很好.我正在尝试处理崩溃因此故意输入错误数据,一次尝试一次.到目前为止,我已经处理了诱导崩溃,但我刚刚更改了登录密码并尝试登录.

gMajorFail:=False;
if not pop3.Login() then
begin
  gMajorFail:=True;
  raise EPOP3.Create('POP3 ERROR: '+IntToStr(pop3.Sock.LastError)+
                     ' When trying to Login to Account');
end;
if gMajorFail then GoTo HadFailure;
Run Code Online (Sandbox Code Playgroud)

它不会跳转到HadFailure-Label,而是跳转到过程中的最后一行代码.

我尝试过使用Try/Finally(这就是我使用Label to GoTo的原因)但它仍然跳到最后一行代码.

我哪里出错了,我该如何解决?

谢谢

J..*_*... 14

哦,男孩...... GoTo用火来杀死它.

也就是说,当你引发一个异常,即行结束时,它不会将控制权返回给你方法的其余部分 - 执行会立即传递给异常处理程序(即:except/finally触发最近的父块,如果不存在,你得到"未处理的异常"对话框).当你提出异常时,你实际上是在抛出你的怀抱,并打算这意味着你自己的代码没有进一步的错误处理可以纠正问题,你的代码不需要做更多的事情.如果您需要清理或以其他方式设置剩余的东西,请先执行所有操作,然后再将异常提升为您做的最后一件事.

文档:

当引发异常时 - 即在raise语句中引用 - 它由特殊的异常处理逻辑控制.加注语句永远不会以正常方式返回控制.相反,它将控制转移到最内层的异常处理程序,该处理程序可以处理给定类的异常.(最里面的处理程序是那个尝试...除了块最近输入但尚未退出的人.)

  • +1用于组合单词GOTO和FIRE :) (4认同)