文章图片
让我们先看看下面的代码 , 为了演示目的 , 我使用了C# 。 代码针对任何支持异常处理的环境都是通用的 。
程序运行一段时间后 , 你会发现 , 执行document.Destroy()的时候出现了断言失败 , 声称你正在销毁仍然有活动插件的文档 。但是我们的确在第一个finally块中调用了document.DestroyPlugins() 。 finally 块的全部意义在于 , 如果不执行它 , 你就无法跳出整个finally代码块 。
那为什么document.DestroyPlugins()没有执行呢?请花个几分钟开动下小脑筋琢磨琢磨 。
原因在于 , 异常处理本身发生了异常 。
异常处理程序在其自己的finally块期间是不活动 。因此 , 如果在 document.Close() 期间抛出异常 , 异常处理程序搜索将从finally块之外的块开始 。
【wi-fi|异常处理器中可能还会出现异常】(异常处理程序在其自己的 finally 子句期间不活动应该是显而易见的 。 这意味着如果在 finally 子句期间发生异常 , 程序将进入无限循环 。 而且也不可能重新抛出一个捕获的异常;你的抛出最终会被你自己捕获!)
在这种情况下 , 异常被一些外部调用者捕获 , 导致第一个finally块的剩余部分被放弃 。第二个finally块确实会运行 , 因为它们包含出现异常的的第一个finally块 。
总结在开发TopomelBox的早期 , 我也积极的使用异常 , 但是从程序的稳定性考虑 , 我慢慢的不再大规模的使用异常 , 因为随着程序的逻辑处理越来越复杂 , 异常出现时 , 代码流会到处乱飞 , 你根本无法轻松的理清代码流程并进行优雅的错误处理 。
逐渐的 , 我喜欢上了简单的返回值+错误描述这种API风格 。
最好的程序 , 是从来不抛异常的程序 。
简单的 , 才是最吼滴 。
最后Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一 , 里面有很多关于Windows的小知识 , 对于广大Windows平台开发者来说 , 确实十分有帮助 。
本文来自:《Your exception handler can encounter an exception》
- wi-fi|Wi-Fi 7开启万兆网络时代 射频前端重定义连接:快还要稳
- 三星S23处理器平台确认,高通成唯一赢家
- CPU|台式机用笔记本处理器,到底行不行?联想启天M540(C)商用台式电脑测试
- 盆地|嫦娥四号研究成果揭秘:月球最大撞击盆地中心成分异常 主要物质来自月壳
- 蓝牙耳机|10000mAh超大电池+八核处理器+3D人脸,三天充一次电的快乐!
- 四维图新|AMD下代霄龙处理器96核心192线程,384M缓存,400W功耗
- 10000mAh超大电池+八核处理器+3D人脸,三天充一次电的快乐!
- vivo Y77是首款搭载联发科天玑930处理器的手机
- AMD此前已经官宣|amdcpu处理器zen4霄龙详细型号曝光
- 酷睿处理器|谁才是轻薄本绝佳选择 i7-12700H对比R7 6800H实测