不要将你的程序钉成竖直
我曾经写过一个恶搞的C++短文,在里面我讥讽地给出了如下的异常处理策略:
通过在代码中打入许多的try...catch结构,我们往往可以阻止程序终止。我们认为这种结果状态是“将尸体钉得竖直起来”。
尽管很草率,我却是真的在总结从悲惨经历夫人脚下学到的一课。
那是一个我们用C++自研的应用程序基础库,多年以来曾经被很多程序员染指过:没有谁的手是干净的。它包含着处理其它一切抛出的异常的代码。在22条军规的Yossarian的领导下,我们决定,或许很大程度上是觉得(决定意味着我们在构建这个怪物前会有更多的思考)这个类的一个实例应该一直或者在尝试中死掉。
结果,我们将多种的异常处理缠结在一起。我们混合了Windows的异常处理结构和C++本身的(你记得C++中有__try...__except吗?我也不记得)。当抛出非预期的东西时,我们尝试再次调用它们,并传递更强力的参数。回头来看,我可能会想在其它的catch子句中写内部的try...catch处理时,某种觉悟在提醒我,我可能不经意间由良好规范的高速公路滑上了芳香的但对身体有害的疯狂小道。然而,这可能只是后知后觉了。
不用说,每当基于这个类的应用程序中出错时,它们就像码头边的黑手党受害者一样消失了,不会留下有用的冒泡显示发生了什么,尽管例行的dump应该被用来记录这个灾难。最后——很久以后——我们对所做的进行反思,感到羞耻。我们采用一个极小且健壮的机制来取代了这一团糟的东西。但这已经出了很多个崩溃了。
我不会用这来烦你,肯定没有人像我们以前那样蠢,但是我最近在一次和一个家伙的在线讨论中,他的学术头衔显示他应该了解得更好。我们讨论了Java的远程事务,如果代码执行失败了,他说,应该当场捕获并阻塞异常。(“接下来如何做呢?”我问到,“拿它做晚餐吗?”
他引用了UI设计者的条款:永远不要让用户看到异常报告(NEVER LET THE USER SEE AN EXCEPTION REPORT),尽管这样似乎解决了问题,一切都是大写。我怀疑他是否该为这些蓝屏的、永久受损的AMT机中的代码负责。
无论如何,如果你遇到到,点头、微笑,并在没有被注意到的情况下,溜向门口。
原文:Don't Nail Your Program into the Upright Position by Verity Stob