何时以及如何在Java中实现自定义异常

1539847635(1).jpg

我们已经在这个博客上谈了很多关于异常处理的内容,并描述了已检查和未检查的异常最佳实践常见错误之间的差异。如果您已阅读这些帖子,您可能认识到了一种模式。您应该提供有关导致异常的情况的详细信息,并且不应删除对调用者有用的任何内容。

您通常可以通过使用带有良好消息的标准异常来实现此目的 Java Exception类描述了事件的类型,消息提供了有关它的详细信息。您可以通过使用自定义异常更进一步使用此概念。

自定义异常使您可以灵活地添加不属于标准Java异常的属性和方法。这些可以存储其他信息,例如特定于应用程序的错误代码,或者提供可用于处理或向用户呈现异常的实用程序方法。





自定义异常的4个最佳实践

当您决定实现自定义异常类时,应该遵循4个一般最佳实践。这些建议使您的代码和API更易于理解。它们还减少了所需的文档量。如果多个开发人员在同一个应用程序或库上工作,新团队成员加入您的项目,或者第三方软件供应商决定使用您的API,那么很快就能获得回报。

1.始终提供福利

先前描述的用于附加属性或方法的示例示出了自定义异常的意图。它提供的信息或功能不属于Java的标准异常。

这是第一个也是最重要的建议的精髓。否则,与JDK已提供的大量异常相比,您的异常不会带来任何好处。

如果您无法提供任何好处,则应该更好地使用标准异常之一,例如UnsupportedOperationExceptionIllegalArgumentException。所有Java开发人员都已经知道这些异常 这使您的代码和API更易于理解。

2.遵循命名约定

当您查看JDK提供的异常类时,您很快就会发现它们的所有名称都以“Exception”结尾。这种通用命名约定在整个Java生态系统中使用。您的自定义异常也应该遵循它。

3.为您的异常类提供Javadoc注释

我们不应该谈论这个最佳实践,但是我已经看到太多自定义异常而没有任何Javadoc。

记录API的所有类,字段,构造函数和方法是一般的最佳实践。如果您不得不使用未记录的API,您就知道原因。未记录的API非常难以使用。

异常类可能不是API中最明显的部分,但它们仍然是它的一部分。只要一个面向客户端的方法抛出异常,异常类就会成为API的一部分。这意味着它需要文档和一个好的Javadoc。

Javadoc应描述异常的一般含义及其可能发生的情况。目标是帮助其他开发人员了解您的API并避免常见的错误情况。

4.提供设置原因的构造函数

通常,在抛出自定义异常之前,代码会捕获标准异常。你不应该隐瞒这个事实。捕获的异常通常包含分析生产事件所需的基本信息。

在以下示例中,NumberFormatException提供有关错误的详细信息。如果不将其设置为MyBusinessException的原因,您将丢失此信息。

Exception RuntimeException  提供了接受 Throwable的构造函数方法,该方法描述了异常的原因。你的例外也应该这样做。您应该实现至少一个构造函数,该构造函数将 Throwable作为参数生成,并将其设置在超类上。

这些是实现自定义异常的最重要的最佳实践。如果您正在寻找更多提示和建议,请查看我的帖子,其中包含9个最佳实践7个常见错误,在处理Java异常时。




实现自定义异常

创建自定义检查的异常很简单。当我解释实现自定义异常的4个最佳实践时,您已经看到了它的多个部分。

实现已检查的异常时,需要扩展类Exception。这是创建自定义异常类所需要做的唯一事情。但正如我之前解释的那样,您还应该提供一个构造函数方法,该方法设置引发异常并提供与可用标准异常相比的好处。

以下示例完成所有这些操作。如您所见,我添加了一个描述异常的Javadoc注释。我还实现了一个构造函数方法,用于在超类上设置导致异常。为了提供与标准异常相比的好处,MyBusinessException使用自定义枚举来存储标识问题的错误代码。客户端可以使用错误代码显示本地化的错误消息,或者告诉用户将此代码包含在支持服务单中。

 

这就是实现自定义检查异常所需要做的全部工作。您现在可以在代码中抛出MyBusinessException,将其指定为方法签名的一部分,并在catch子句中处理它。

 

实现未经检查的异常

自定义未经检查的异常的实现几乎与已检查的异常相同。您应该遵循我在本文开头所解释的相同建议。唯一的区别是未经检查的异常必须扩展RuntimeException而不是Exception

 

您可以像使用任何其他未经检查的异常一样使用MyUncheckedBusinessException。您可以将其抛入代码中并在catch子句中捕获它。你可以但不需要指定你的方法是否抛出它。





摘要

如本文所述,自定义异常的实现很容易。您只需要为自定义检查的异常扩展Exception,如果是自定义的未经检查的异常,则需要RuntimeException

除此之外,您应该遵循一些最佳实践。它们使您的代码更易于阅读,并且您的API更易于使用。以下是Java中自定义异常的4个最重要的最佳实践:

  • 如果与Java的标准异常相比它提供了一个好处,那么您应该只实现一个自定义异常。
  • 您的异常的类名应以Exception结尾
  • 如果API方法指定了异常,则异常类将成为API的一部分,您需要对其进行记录。
  • 您应该提供一个设置异常原因的构造函数。

将Retrace APM与代码分析一起使用时,您可以直接从Java 收集异常,而无需更改任何代码!