导致代码跳跃的异常

时间:2013-07-29 23:20:11

标签: 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;

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

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

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

由于

1 个答案:

答案 0 :(得分:14)

噢,男孩......用火焚烧GoTo

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

来自the documentation

  

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