-1

我将 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(这就是我使用标签转到 GoTo 的原因),但它仍然会直接跳到最后一行代码。

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

谢谢

4

1 回答 1

14

GoTo哦,男孩……用火 杀死它。

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

文档中

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

于 2013-07-29T23:39:51.957 回答