如何创建在 java 中包含多个异常的自定义异常

How to create a custom exception which wraps mutliple exceptions in java

如何创建自定义异常来包装三个不同的异常,如 InvalidContextExceptionIllegalArgumentException。例如,假设有一个方法:

public void method() throws IOException, IllegalArgumentException, 
InstantiationException, IllegalAccessException {
      //Body of the method
}

我想通过创建自定义异常来最大程度地减少 throws 关键字后的异常数量,该自定义异常一起处理 InstantiationExceptionIllegalAccessException 以及 IllegalArgumentException,如下所述:

 public void method() throws IOException, CustomException {
       //Body of the method
 }

本着提问的精神:

您必须捕获方法中的各种异常,然后从 catch 块中抛出 CustomException。 "wrap" 异常的能力是通过 Exception class 本身内置的(参见 Exception(Throwable cause) 构造函数)。

public void method() throws IOException, CustomException {
    try {
        //Body of the method
    } catch (IllegalArgumentException | InstantiationException | IllegalAccessException e) {
        throw new CustomException(e);
    }
}

也就是说,IllegalArgumentException 不是已检查的异常,所以您无论如何都不必声明它。

另外值得指出的是,以上内容是基于您指定要创建自定义异常的。另一种选择是在您的 throws 子句中声明某种类型,该类型是可能实际抛出的各种已检查异常的公共基础 class。例如,列表中的两个已检查异常都是 ReflectiveOperationException 的子 class,因此您可以只说

public void method() throws IOException, ReflectiveOperationException {
    //Body of the method
}

当然,代价是您无法为那些编写调用您的方法的代码提供信息,因此这可能会限制他们的异常处理程序的质量。在极端情况下,您 可以 只说 throws Thorwable,但这是非常糟糕的形式。

声明 CustomException class 仅声明具有这些特定 classes 的构造函数。
这样它只能包装这些异常而不能包装任何其他异常。

public class CustomException extends RuntimeException{

    public CustomException(IllegalArgumentException e) {
        super(e);
    }

    public CustomException(IllegalAccessException  e) {
        super(e);
    }

    public CustomException(InstantiationException e) {
        super(e);
    }

}

您可以捕获每个抛出的异常并在自定义异常中重新抛出它:

...
} catch (IllegalArgumentException | InstantiationException | IllegalAccessException ex) {
    throw new CustomException(ex);
}

CustomException 的构造函数会将任何异常作为参数并重新表述或获取其消息。当然,CustomException 必须扩展 Exception 才能被抛出。