我们什么时候应该创建自己的 Java 异常类?[已关闭]
从良好的设计/实践的角度来看,我们什么时候应该创建和使用自定义Java异常类,而不是已经在Java中预定义的异常类?
在一些应用程序中,我看到几乎自定义了异常类,它们努力始终使用本机Java异常。另一方面,有一些应用程序为(几乎)所有内容定义自定义例外。
从良好的设计/实践的角度来看,我们什么时候应该创建和使用自定义Java异常类,而不是已经在Java中预定义的异常类?
在一些应用程序中,我看到几乎自定义了异常类,它们努力始终使用本机Java异常。另一方面,有一些应用程序为(几乎)所有内容定义自定义例外。
如果新的自定义异常没有有关客户端代码的有用信息,则尽量不要创建新的自定义例外。
以下代码有什么问题?
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");
从良好的设计/实践的角度来看,我们什么时候应该创建和使用自定义java异常类,而不是已经在java中预定义的异常类?
当现有异常名称无法满足您的需求时。
另一个设计问题是扩展“好”异常类;例如,如果您引发与 I/O 相关的异常,则理想情况下应继承 ;如果异常指示程序员错误,则应继承(即,取消选中异常)。IOException
RuntimeException
引发自定义异常还允许您以更精确的方式处理异常;例如,如果您定义了继承,那么您可以对其进行特殊处理:FooException
IOException
try { ... }
catch (FooException e) { ... } // Catch it _before_ IOException!
catch (IOException e) { ... }
此外,异常是像任何其他类一样的类,因此您可以添加自定义方法等;例如,Jackson定义了JsonProcessingException
,它继承了。如果捕获它,则可以使用 .getLocation()
获取解析错误的位置信息。IOException