异常处理器中可能还会出现异常
让我们先看看下面的代码,为了演示目的,我使用了C#。代码针对任何支持异常处理的环境都是通用的。
程序运行一段时间后,你会发现,执行document.Destroy()的时候出现了断言失败,声称你正在销毁仍然有活动插件的文档。 但是我们的确在第一个finally块中调用了document.DestroyPlugins()。finally 块的全部意义在于,如果不执行它,你就无法跳出整个finally代码块。
那为什么document.DestroyPlugins()没有执行呢?请花个几分钟开动下小脑筋琢磨琢磨。
原因在于,异常处理本身发生了异常。
异常处理程序在其自己的finally块期间是不活动。 因此,如果在 document.Close() 期间抛出异常,异常处理程序搜索将从finally块之外的块开始。
(异常处理程序在其自己的 finally 子句期间不活动应该是显而易见的。这意味着如果在 finally 子句期间发生异常,程序将进入无限循环。而且也不可能重新抛出一个捕获的异常;你的抛出最终会被你自己捕获!)
在这种情况下,异常被一些外部调用者捕获,导致第一个finally块的剩余部分被放弃。 第二个finally块确实会运行,因为它们包含出现异常的的第一个finally块。
总结
在开发TopomelBox的早期,我也积极的使用异常,但是从程序的稳定性考虑,我慢慢的不再大规模的使用异常,因为随着程序的逻辑处理越来越复杂,异常出现时,代码流会到处乱飞,你根本无法轻松的理清代码流程并进行优雅的错误处理。
逐渐的,我喜欢上了简单的返回值+错误描述这种API风格。
最好的程序,是从来不抛异常的程序。
简单的,才是最吼滴。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Your exception handler can encounter an exception》
最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。
- 下一篇: 思想调试:为什么4核CPU上只有一个核在工作?
- 上一篇: 窗口可不是什么便宜的东西
相关推荐
- 发送Windows消息的几种方法
- Posted on 12月27日
- 不要被各种专业术语吓倒
- Posted on 11月29日
- 使用吉特哈布Actions对C++代码进行分析
- Posted on 10月29日
- 为什么对话框创建后是隐藏状态的
- Posted on 12月27日
评论已关闭。