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

标签 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);
         }
     }
    

    提供上述自定义异常的真正值(value)是什么? 为什么我不能抛出一个新的 RuntimeException("error occurred", 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;
         }
     }
    

    这在某种程度上优于 IncorrectFileExtensionException,因为我们至少提供了一些错误代码。但是,如果所有自定义异常都像上面那样结束(我的意思是错误代码)怎么办?

    我的问题是:自定义异常的最佳做法是什么?我们究竟应该在什么时候使用自定义异常? IncorrectFileExtensionException 真的是一个好方法吗?

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

最佳答案

public class MyBusinessRuntimeException extends RuntimeException {
    // copy all the constructors you need
}

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

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

考虑

 Exception
     FileException
         FileExtensionException
             IncorrectFileExtensionException
             UnsupportedFileExtensionException

关于java - 为什么我们不能使用 RuntimeException 而不是创建自定义异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58197257/

相关文章:

java - java中如何从控制台获取号码?

Java异常处理不返回值

exception - 绝对强制捕获 Haskell 中的错误

Python:为什么 __getattr__ 会捕获 AttributeErrors?

java - Antlr 解析器规则无法匹配指定的词法分析器规则

java - 同步对象: Locking Code vs Locking Object

java - 使用列表/表中的 json 创建树

android - 创建 MultiUserChat 时出现 "$XMPPErrorException: XMPPError: forbidden - auth"错误

c# - 在公共(public)异常处理程序中的 catch block 外部抛出不带参数的语句

Java:比较具有相同值的两个不同类型的对象,返回 true