为什么我们不能使用RuntimeException而不是创建自定义异常?

joh*_*ohn 5 java exception

1)我一直在寻找什么时候才应该创建自定义异常。我发现了这个例子:

public class IncorrectFileExtensionException extends Exception {
    public IncorrectFileExtensionException () {

    }

    public IncorrectFileExtensionException (String message) {
        super (message);
    }

    public IncorrectFileExtensionException (Throwable cause) {
        super (cause);
    }

    public IncorrectFileExtensionException (String message, Throwable cause) {
        super (message, cause);
    }
}
Run Code Online (Sandbox Code Playgroud)

提供上述自定义异常的真正价值是什么?除了创建上面的自定义异常外,我为什么不能抛出新的RuntimeException(“发生错误”,e)?我已经在互联网上看到许多创建类似的自定义异常的示例,但是我不明白上述方法的真正好处是什么。

如果我们创建类似IncorrectFileExtensionException的项目,那么我们的项目最终会出现许多自定义异常。

2)我也发现了这一点:

public class MyUncheckedBusinessException extends RuntimeException {

    private static final long serialVersionUID = -8460356990632230194L;

    private final ErrorCode code;

    public MyUncheckedBusinessException(ErrorCode code) {
        super();
        this.code = code;
    }

    public MyUncheckedBusinessException(String message, Throwable cause, ErrorCode code) {
        super(message, cause);
        this.code = code;
    }

    public MyUncheckedBusinessException(String message, ErrorCode code) {
        super(message);
        this.code = code;
    }

    public MyUncheckedBusinessException(Throwable cause, ErrorCode code) {
        super(cause);
        this.code = code;
    }

    public ErrorCode getCode() {
        return this.code;
    }
}
Run Code Online (Sandbox Code Playgroud)

在某种程度上IncorrectFileExtensionException,它比更好,因为我们至少提供了一些错误代码。但是同样,如果所有自定义异常都以上述方式结束(我的意思是错误代码)怎么办?

请不要投反对票,因为我实际上并不是在问如何创建自定义例外,但是我的问题是:自定义例外的最佳实践什么?我们到底应该什么时候去定制异常?是否IncorrectFileExtensionException真的是一个好方法吗?

3)我们什么时候不应该创建自定义异常?

And*_*lko 5

public class MyBusinessRuntimeException extends RuntimeException {
    // copy all the constructors you need
}
Run Code Online (Sandbox Code Playgroud)

这是一个好习惯,因为它有助于对错误类型进行分组和区分。您可以声明“我的API抛出MyBusinessRuntimeException类型”,并抽象出RuntimeException您无法控制的其他类型。它会告诉用户将要使用的异常,以及应将哪些异常视为异常。

IncorrectFileExtensionException不应该直接扩展Exception。它们处于完全不同的抽象级别。

考虑

 Exception
     FileException
         FileExtensionException
             IncorrectFileExtensionException
             UnsupportedFileExtensionException
Run Code Online (Sandbox Code Playgroud)


wiz*_*zle 5

要考虑的另一件事是为异常创建处理程序。

如果抛出以下两个异常:new RuntimeException("User not found") 和 new RuntimeException("Event not created") 你如何处理它们?捕获每个运行时异常,然后使用 if-else 比较消息?

从长远来看,这将是痛苦的。当您单元测试抛出异常的逻辑时也会发生同样的情况 - 您将再次必须使用 if(ex.message.equals(someMessage)) 来进行单元测试。

那么当不同业务逻辑的异常消息相同时会发生什么?仅使用自定义异常操作就可以让您轻松处理流程 - 从使捕获层次结构清晰到创建一些告诉处理程序如何行为的自定义解决方案(例如告诉控制器建议抛出 404)