错误处理在许多代码库中占据了主导地位。我说的“主导”,并不是指错误处理是它们所做的一切。我的意思是,由于到处都是错误处理的代码,几乎不可能看清代码实际上在做什么。错误处理很重要,但如果它掩盖了逻辑,那就有问题了。

使用异常而不是返回码

在遥远的过去,有许多语言没有异常。在这些语言中,处理和报告错误的技术是有限的。你要么设置一个错误标志,要么返回一个错误码,让调用者可以检查。

首先写出你的 try-catch-finally 语句

在某种程度上,try 块就像事务。你的 catch 必须让程序处于一个一致的状态,不管 try 中发生了什么。因此,当你编写可能抛出异常的代码时,首先从 try-catch-finally 语句开始是一个好习惯。这有助于你定义代码的使用者应该期望什么,不管 try 中执行的代码出了什么问题。

通过异常提供上下文

你抛出的每个异常都应该提供足够的上下文来确定错误的来源和位置。

创建提供信息量丰富的错误消息,并将其与你抛出的异常一起传递。提及失败的操作和失败的类型。如果你的应用程序中有日志记录,传递足够的信息以便能够在 catch 中记录错误。

不要返回空值

如果你有从方法返回 null 的冲动,考虑抛出一个异常或者返回一个特殊案例对象。如果你是在从第三方 API 调用一个可能返回 null 的方法,考虑用一个方法包装它,该方法要么抛出一个异常,要么返回一个特殊案例对象。

不要传递空值

从方法返回 null 是不好的,但向方法传递 null 更糟。除非你正在使用一个期望你传递 null 的 API,否则你应该尽可能避免在你的代码中传递 null。