wi-fi|异常处理器中可能还会出现异常

wi-fi|异常处理器中可能还会出现异常

文章图片


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