异常处理器中可能还会出现异常

news/2024/7/5 6:57:30

让我们先看看下面的代码,为了演示目的,我使用了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》

 


http://www.niftyadmin.cn/n/3242423.html

相关文章

工具类算法--快排的优化(Java)

快排简介 快速排序(quick sort) 是算法题中经常遇到的工具类算法,所谓工具类算法就是存在很多的算法或者思考题是基于相同思想进行解答的,那么这类算法被考察的概率很高,对于这类算法的思考和探究也就十分有意义&#…

Unity 2019-2-14f1 Windows10 出现空错误的解决方法

问题描述: 刚接触Unity,因为一些原因必须使用 2019-2-14f1 这个版本,安装后出现该问题。 直接新建未做任何修改的项目不能运行,Console里出现两个空错误,如下图: 所有的脚本失效,不能添加&…

打造メンアットワーク!魔兽学院men at work2《永远的羁绊》 中文终极版(刺杀事件、H补丁)

这个是我玩的第一个GALGAME,看到这个译名估计很多人都不大明白。曾经一度还有人以为和魔兽争霸有什么关系。其实繁体版译名就是永远的羁绊。本名为MAN AT WORK !2,山本大妈出品。 这个游戏对我来说是有纪念意义的。因为这是我买的第一个正版…

关于专栏-------WebServer二三事

新学期的第一个月在忙碌的工作和学习中结束了,学期课不是很多,但是由于不仅要保证正常的上课,还得兼顾项目的进度和复习,总是感觉时间不太够用,有时觉得假如早半个学期接触编程就好了,也不会像现在一样捉襟…

实训C++语言设计——3*3矩阵转置函数

编写并测试3*3矩阵转置函数,并使用数组保存3*3矩阵。算法:先在主函数中定义一个二维数组,然后通过print函数来完成输出功能,这是通过喜欢来完成的,然后就是转置,转置时可以通过一个辅助数组来完成&#xff…

实训C++语言设计——两个字符串的连接

编程实现两个字符串的连接,要求使用字符数组保存字符串,不使用系统函数。算法:先在主函数中定义两个字符数组,字符数组的最后一个字符是0,把它当作循环的终止条件,先把一个指针指向第一个字符串的最后一个字…

博客后续在GitHub page更新

CSDN将不会再更新,最新博客请移步:Lin’s Blog

实训C++语言设计——定义一个类

定义一个类,它包含私有数据成员姓名,地址,城市,邮政编码,公有函数成员:构造函数完成初始化,一个函数完成数据成员的输出,另外一个函数完成修改名字的功能。算法:根据上述…