
文章图片
让我们先看看下面的代码 , 为了演示目的 , 我使用了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》
- 英特尔13代酷睿非k处理器cinebench测试曝光
- 12月13日消息|苹果appletv4k搭载的a15处理器为5核心
- CPU处理器|正面刚x86 第三大CPU架构RISC-V冲击高性能:5nm 192核
- 苹果已测试部分m1/m2mac设备出现wi-fi连接问题
- 这是一款性价比很高的千元机|性价比很高的千元机,搭载骁龙870处理器,支持80w快充
- 12月13日消息|英特尔14代meteorlake-s桌面处理器泄露
- 腾讯云|2022年腾讯全球数字生态大会:腾讯云推出搭载第四代AMD EPYC处理器的星星海服务器
- 对于Intel处理器而言|i7-8700和i7-8700k选谁更好
- 不带核显的处理器与标准版处理器相比性价比更高|i5-9400f与r5-2600谁更值得选择
- 苹果已测试补丁,部分 M1 / M2 Mac 设备出现 Wi-Fi 连接问题
