如何抛出一个 Delphi 无法捕获的异常?

4

是否有可能在Delphi中构建一小段代码,使得一个假想的EChuckNorrisException无法被捕获?

对于Java编程语言,我发现这个问题已经在Uncatchable ChuckNorrisException中被回答为


2
在有人发表评论指出某个回答事实上是错误的之后,那个“是”答案已被删除。 - Mason Wheeler
1
我相信你有你的理由,但是想要制造一个无法捕获的异常对我来说似乎有些可疑。 - Jerry Dodge
4
+1给查克·诺里斯!((: - user497849
2
好的,我猜这与同名演员有些联系?也许如果我来自美国,我会立刻明白... - Andreas Rejbrand
3
请参考链接问题中的评论,其中有一个提示:““你不能抛出ChuckNorrisException,它会抛掉你:)” - mjn
显示剩余3条评论
2个回答

9

在Delphi中,可以触发任何对象(TObject的后代类),但按照惯例,通常只限于从基础Exception类继承的对象。同时,可以创建一个全局异常处理程序来捕获任何异常

大多数试图以某种方式报告信息的全局异常处理程序看起来像这样:

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

如果你抛出的对象并不是从Exception类继承而来的,那么它将通过这个样式而不被捕获。

然而,你也可以像这样写:

try
...
except
  ...
end;

那种异常处理方式不会错过任何东西。

如果您引发了一个没有被任何地方捕获的异常,程序将立即以错误终止。如果这是预期的效果,可以通过使用非零错误代码调用 Halt 来实现相同的效果。


5
此外,无论是从Exception派生还是不派生的Delphi中的异常,最终都会通过操作系统API调用来实际引发异常,例如在Windows上使用RaiseException()。运行时库(RTL)已经设置了核心异常处理程序,以捕获操作系统可以报告的几乎所有类型的异常。抛出的对象会被包装成特殊的异常代码,以便这些处理程序可以识别它们,并在触发except块时将原始异常数据解码回原始对象。 - Remy Lebeau
1
嗯。假设地说:那个无法捕获的异常会发生什么?它会落在哪里?谁能处理它?如果你想要到达操作系统,一个简单的“halt”命令就可以解决问题了吗? - alzaimar

0
有时候,DLL内引发的异常如果在DLL内没有被捕获,也不会被调用该DLL的应用程序的异常处理程序捕获。我想知道是否可能在不使用DLL的情况下模仿这种行为?

唯一模仿那样的东西的方法是使用 dll。 - Jerry Dodge
2
这是一个未捕获的异常,因为缺少异常处理,而不是无法捕获的异常。您可以通过在应用程序中完全禁用异常处理来模仿该行为,请参阅帮助中的JITEnable。 - Sertac Akyuz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接