Java 自定义异常,多少是太多?

Java 自定义异常,多少是太多?,java,spring-boot,exception,Java,Spring Boot,Exception,我一直在想我应该有多少个异常,我看到其他帖子说有多个异常是好的,这样可以提高代码的可读性,如果有错误的话,可以更好地理解错误 现在我有5个异常,检查UserNotFoundException和AccountExpenseNotFoundException基本上这两个异常都是相同的,但指的是不同的实体 这种做法不好吗? 我是否应该创建一个像EntityNotFound这样的异常来处理此问题?不,这很好。一个缺点是你最终会写下这样的东西: try { bookkeeperthingie();

我一直在想我应该有多少个异常,我看到其他帖子说有多个异常是好的,这样可以提高代码的可读性,如果有错误的话,可以更好地理解错误

现在我有5个异常,检查UserNotFoundException和AccountExpenseNotFoundException基本上这两个异常都是相同的,但指的是不同的实体

这种做法不好吗?
我是否应该创建一个像EntityNotFound这样的异常来处理此问题?

不,这很好。一个缺点是你最终会写下这样的东西:

try {
   bookkeeperthingie();
} catch (AccountExpenseAlreadyExistsException |
   AccountExpenseNotFoundException | UsernameOrPasswordInvalidException |
   Blablabla | Morebla e) {
}
为了避免这种情况,请确保您的异常遵循层次结构。例如,您可能有:

public class BookkeepingException extends Exception {
    public BookkeepingException(String msg) { super(msg); }
    public BookkeepingException(String msg, Throwable cause) { super(msg, cause); }
}

public class AccountExpenseAlreadyExistsException extends BookkeepingException { ... }
等等。如果您发现API的用户想要捕获任何类型的“簿记未找到的东西”异常是非常合理的,那么将其作为层次结构中的一个级别(但我觉得这不太合适)

现在你可以写:

try {
    bookkeepingthingie();
} catch (BookkeepingException e) {
}

如果您不特别关心出错的类型,如果您这样做了,请捕获一个更具体的问题,或者甚至将它们结合起来(如果找不到,请执行此操作。对于任何其他簿记问题,请执行此操作-您可以使用层次结构来执行此操作;首先捕获更具体的问题,然后再捕获常规问题)。

我假设这些是已检查的异常?如果API的客户端可能希望以相同的方式处理这些异常,例如从REST端点返回404,那么您可以使它们都扩展基类EntityNotFound。就我个人而言,我不会使用异常来报告找不到什么东西,我会返回一个可选的。是的,这些都是检查过的异常,我的想法是尽可能地使用最指定的异常,我不确定有很多异常是一种好的做法,我可能最终会有100个异常