异常机制的最佳实现是什么?

时间:2008-09-15 19:34:21

标签: language-agnostic exception

大多数程序语言都有某种异常处理方式;一些语言具有返回码,其他语言具有尝试/捕获,或救援/重试等,每个语言在大型组开发工作中具有可读性,稳健性和实用有效性的特征。哪一个是最好的,为什么?

5 个答案:

答案 0 :(得分:2)

我想说这取决于你问题的性质。不同的问题域可能需要几乎任意的错误消息,而其他简单的任务只能在出错时返回NULL或-1。

错误返回代码的问题在于您正在污染/屏蔽错误,因为它可以被忽略(有时没有API客户端不知道他们应该检查错误代码)。它从手头的方法中得到(合理的)有效输出。

想象一下,您有一个API,您要求为某个地图索引关键字,将其存储在列表中,然后继续运行。然后,API稍后会发送回调,然后该方法可能会使用在此示例中可能为-1的键(错误代码)遍历表。 BOOM,当你在某个数组中索引为-1时,应用程序崩溃了,这些问题很难确定。这仍然是一个简单的例子,但它说明了错误代码的问题。

另一方面,错误代码比抛出异常更快,您可能希望将它们用于频繁访问的方法调用 - 如果适合返回此类错误代码。我会说,尝试在私有程序集中封装这些类型的错误代码是非常好的,因为您没有将这些错误代码暴露给API的客户端。永远记得严格记录这些方法,因为这些应用程序核武器可能会在应用程序中长时间徘徊,因为它们在它应用之前被触发。

就个人而言,我更喜欢在某种程度上混合它们。我只使用例外 - 例外 - 当程序运行到一个不期望的状态并且需要告知某些事情已经超出计划时。我不是在我的代码中编写try / catch块的傻瓜,但这完全归功于个人偏好。

答案 1 :(得分:1)

最适合什么?语言设计始终是权衡取舍。返回码的优点是它们不需要常规函数调用之外的任何运行时支持;缺点是1)你总是要检查它们2)返回类型必须有一个不是函数调用的有效结果的失败值。

自动异常处理的优点是代码中的错误条件不会消失。

各种语言中的异常处理语义(以及Lisp的条件系统,E的弹出器等)之间的差异主要表现在如何继续执行程序执行时如何处理堆栈展开。

总而言之:当您需要编写可读,强大的软件时,自动异常处理非常有价值,特别是在大型团队中。让计算机跟踪错误条件可以让您在阅读代码时少考虑一下,并消除了出错的机会。我唯一一次使用返回代码来表示错误,如果我在一个没有异常处理的语言中实现了一个没有它的语言。

答案 2 :(得分:0)

尝试/捕捉/终于令人钦佩地完成了这项工作。

它允许程序员优雅地处理特定条件和一般故障。

所有的说法和完成我确信每一个都和其他任何一样好。

答案 3 :(得分:0)

我必须使用try / catch概念。我觉得在可读性方面,这为代码维护者提供了最多的东西。只要异常被正确输入并且相关消息包含足够详细的数据(我个人不喜欢包含堆栈跟踪但是我知道有很多人这样做而且这会使这个更加均匀),找到函数调用链应该是相当直接的。更具可追溯性。)返回代码实现需要逐个程序的外部代码定义表。从个人经验来看,维护和参考都很笨拙。

答案 4 :(得分:0)

有关异常处理的异常视角,请参阅Haskell的Control.Exception monad

相关问题