【问题标题】:How do I throw an exception that Delphi cannot catch?如何抛出 Delphi 无法捕获的异常?
【发布时间】:2012-12-02 17:41:04
【问题描述】:

是否有可能在 Delphi 中构造一个使假设的 EChuckNorrisException 无法捕获的代码的 sn-p?

对于我刚刚发现的 Java 编程语言,Uncatchable ChuckNorrisException

中的回答是 Yes

【问题讨论】:

  • “是”的答案在有人发表评论表明事实不正确后已被删除。
  • 我相信你有你的理由,但对我来说,想要做出一个无法捕获的例外似乎有点可疑。
  • +1 为查克·诺里斯! (((:
  • 好的,我想这与actor with the same name 有一些联系?如果我来自美国,也许我会马上得到它......
  • @AndreasRejbrand 查看linked question cmets 以获得提示:"You can't throw a ChuckNorrisException, it throws you :)"

标签: delphi exception exception-handling


【解决方案1】:

没有。在 Delphi 中,可以raise 任何对象(TObject descendant,)虽然按照惯例,这通常仅限于从基类 Exception 继承的对象。并且可以创建一个全面的异常处理程序来捕获任何东西。

大多数试图以某种方式报告信息的包罗万象的异常处理程序如下所示:

try
...
except
  on E: Exception do
    ...
end;

所以如果你提出的东西不是来自Exception,它会通过这种风格而不会被抓住。

不过,也可以这样写:

try
...
except
  ...
end;

那种风格的异常处理程序不会得到任何东西。

如果你引发了一个没有在任何地方捕获的异常,程序将立即终止并出现错误。如果这是预期的效果,则可以通过使用非零错误代码调用 Halt 来做同样的事情。

【讨论】:

  • 此外,Delphi 中的异常,无论是否源自Exception,最终都会通过操作系统 API 调用来实际引发异常,例如 Windows 上的 RaiseException()。 RTL 具有核心异常处理程序,可以捕获操作系统可以报告的几乎任何类型的异常。引发的对象使用特殊的异常代码进行包装,因此这些处理程序可以在触发except 块时识别它们并将原始异常数据解码回原始对象。
  • 嗯。假设:那个无法捕获的异常会发生什么?它会降落在哪里?谁能照顾它?如果它是您想要访问的操作系统,那么简单的halt 会不会成功?
【解决方案2】:

有时,调用应用程序的异常处理程序也不会捕获在 dll 中引发但未在该 dll 中捕获的异常。我想知道是否可以在不使用 dll 的情况下模仿这种行为?

【讨论】:

  • 模仿类似情况的唯一方法是使用 dll。
  • 这是一个未捕获的异常,因为缺少异常处理,而不是无法捕获的异常。您可以通过在应用程序中完全禁用异常处理来模仿该行为,请参阅帮助中的 JITEnable。
猜你喜欢
  • 2021-09-02
  • 2011-04-05
  • 2015-09-23
  • 2013-08-02
  • 2018-05-30
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多