系统正确传达和处理异常有很多要求。还有多种语言可供选择以实现这一概念。
例外要求(无特定顺序):
文档:一种语言应具有文档API可能引发的异常的含义。理想情况下,此文档介质应可在机器上使用,以允许编译器和IDE为程序员提供支持。
传输异常情况:显然,这允许功能传达阻止被调用功能执行预期动作的情况。我认为这类情况分为三大类:
2.1代码中的错误导致某些数据无效。
2.2配置或其他外部资源问题。
2.3本质上不可靠的资源(网络,文件系统,数据库,最终用户等)。这些有点极端,因为它们不可靠的本性应该让我们期待它们的零星失败。在这种情况下,是否将这些情况视为例外?
为代码提供足够的信息来处理它:异常应向被调用者提供足够的信息,以便被调用者可以做出反应并可能处理这种情况。这些信息也应该足够,以便在记录该异常时将为程序员提供足够的上下文,以识别和隔离有问题的语句并提供解决方案。
向程序员提供有关其代码执行状态的当前状态的信心:软件系统的异常处理能力应足够强,以提供所需的防护措施,同时又不影响程序员,因此他可以专注于执行以下任务:手。
为涵盖这些内容,以下方法已以多种语言实现:
受检查的异常 提供了记录异常的好方法,并且从理论上讲,如果正确实施,应该可以确保一切都很好。但是,这样做的代价是,许多人认为通过吞下异常或将它们作为未检查的异常重新抛出来绕过它更具生产力。如果使用了不适当的检查异常,则几乎失去了它的全部用处。同样,检查异常使创建时间稳定的API变得困难。在特定域内实现通用系统将带来特殊情况的负担,这些特殊情况将变得难以使用单独检查的异常来维护。
未检查的异常 -比检查的异常通用得多,它们无法正确记录给定实现的可能异常情况。他们完全依赖临时文档。这就造成了一种情况,即介质的不可靠特性被提供可靠性外观的API所掩盖。同样,当抛出这些异常时,它们会在抽象层中向上移动,从而失去其含义。由于它们的文献记录不充分,因此程序员无法专门针对它们,并且经常需要投放比必要范围更广的网络,以确保辅助系统(如果发生故障)不会导致整个系统崩溃。这使我们又回到了吞咽问题检查提供的异常。
多状态返回类型 在这里,它依赖于不相交的集合,元组或其他类似的概念来返回预期结果或代表异常的对象。这里没有堆栈展开,没有代码切入,一切正常执行,但是必须在继续之前验证返回值是否存在错误。我还没有真正使用它,因此无法从经验中发表评论,我承认它解决了绕过正常流程的异常的一些问题,但是仍然会遇到与已检查的异常几乎相同的问题,既麻烦又不断地“面对您”。
所以问题是:
您在这方面的经验是什么?根据您的看法,您是为语言提供良好的异常处理系统的最佳人选?
编辑:写完这个问题后几分钟,我遇到了这个帖子,怪异的!
noexcept
以C ++来看故事也可以为C#和Java中的EH带来非常好的见解。)