我们什么时候应该创建自己的 Java 异常类?[已关闭]

2022-09-01 01:00:31

从良好的设计/实践的角度来看,我们什么时候应该创建和使用自定义Java异常类,而不是已经在Java中预定义的异常类?

在一些应用程序中,我看到几乎自定义了异常类,它们努力始终使用本机Java异常。另一方面,有一些应用程序为(几乎)所有内容定义自定义例外。


答案 1

异常处理的最佳实践

如果新的自定义异常没有有关客户端代码的有用信息,则尽量不要创建新的自定义例外。

以下代码有什么问题?

public class DuplicateUsernameException extends Exception {}

除了指示性异常名称外,它不会向客户端代码提供任何有用的信息。不要忘记 Java Exception 类与其他类一样,您可以在其中添加您认为客户端代码将调用的方法以获取更多信息。

我们可以向 中添加有用的方法,例如:DuplicateUsernameException

public class DuplicateUsernameException
    extends Exception {
    public DuplicateUsernameException 
        (String username){....}
    public String requestedUsername(){...}
    public String[] availableNames(){...}
}

新版本提供了两个有用的方法:,返回请求的名称,以及 返回与请求的用户名类似的可用用户名数组。客户端可以使用这些方法来通知请求的用户名不可用,并且其他用户名可用。但是,如果您不打算添加额外的信息,那么只需抛出一个标准异常:requestedUsername()availableNames()

throw new IllegalArgumentException("Username already taken");

答案 2

从良好的设计/实践的角度来看,我们什么时候应该创建和使用自定义java异常类,而不是已经在java中预定义的异常类?

当现有异常名称无法满足您的需求时。

另一个设计问题是扩展“好”异常类;例如,如果您引发与 I/O 相关的异常,则理想情况下应继承 ;如果异常指示程序员错误,则应继承(即,取消选中异常)。IOExceptionRuntimeException

引发自定义异常还允许您以更精确的方式处理异常;例如,如果您定义了继承,那么您可以对其进行特殊处理:FooExceptionIOException

try { ... }
catch (FooException e) { ... } // Catch it _before_ IOException!
catch (IOException e) { ... }

此外,异常是像任何其他类一样的类,因此您可以添加自定义方法等;例如,Jackson定义了JsonProcessingException,它继承了。如果捕获它,则可以使用 .getLocation() 获取解析错误的位置信息。IOException