我正在使用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的原因)但它仍然跳到最后一行代码。
我哪里出错了,我该如何解决?
由于
答案 0 :(得分:14)
GoTo
。
也就是说,当你引发一个异常,即行结束时,它不会将控制权返回给你方法的其余部分 - 执行会立即传递给异常处理程序(即:最近的父except/finally
块触发,如果不存在,则会出现“未处理的异常”对话框。当你提出异常时,你实际上是在抛出你的怀抱,并打算这意味着你自己的代码没有进一步的错误处理可以纠正问题,你的代码不需要做更多的事情。如果您需要按顺序清理或以其他方式设置剩余的东西,请先执行所有操作,然后再将异常提升为最后一件事。
引发异常时 - 即在raise语句中引用 - 它由特殊的异常处理逻辑控制。加注语句永远不会以正常方式返回控制。相反,它 将控制转移到可以处理的最内层异常处理程序 给定类的例外。 (最里面的处理程序是其中的 尝试...除了块最近进入但尚未退出。)