【问题标题】:Exception causing a leap in code导致代码飞跃的异常
【发布时间】:2013-07-29 23:20:10
【问题描述】:

我将 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 的原因),但它仍然会直接跳到最后一行代码。

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

谢谢

【问题讨论】:

  • 你为什么要抛出异常?
  • 跳到最后一行后...会不会跳回应该的位置?我在 D2007 中调试 ocx 时遇到了这种行为。这似乎是“正常的”。
  • @DavidHeffernan 我也想知道,但不敢问。
  • @DavidHeffernan 该代码直接取自 Synapse 示例。我认为这一切都会按预期工作。确实如此,但显然不是在遇到异常时。
  • @user2175495 我认为您不了解异常如何改变程序控制流。

标签: delphi exception-handling delphi-5


【解决方案1】:

哦,男孩……用火杀死那个GoTo

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

来自the documentation

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

【讨论】:

  • @J... 回到方舟上,带上 whosr...。 :) 如果它是语言的有效部分,那么没有理由不使用它。此外,还添加了 GoTo 以帮助处理异常。我认为当测试失败时,我假设你测试它以及成功,使用任何需要的东西都是公平的游戏。所以,没有有用的答案是吗?我确实单击了帮助并阅读了它,但它从未提供有关如何“处理异常”的建议,这正是我所要求的。大卫最接近“为什么加注?”我会尝试删除它并从那里开始。
  • 实际上,我要删除的是goto。我问“为什么要加薪?”因为混合两种错误处理模型是没有意义的。事实上,goto 在没有异常处理错误的语言中很有用。例如,您可以通过所有现代操作系统的源代码找到它。
  • @DavidHeffernan 该部分后面有很多内容也会引发异常,如果我不尝试跳过它们,它还会提供另外五个异常。我正在尝试“修复”(免费)一些由其他人编写的旧代码,并希望尽快解决这个问题。正如您在上面的评论中看到的那样,它是固定的,但几乎不是及时的。 :) 我不知道为什么这里的大多数人似乎认为讨论编码实践是有帮助的,而我想要的只是“做这个......然后这个......”
猜你喜欢
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多