如何创建将Java中的多行异常包装起来的自定义异常

时间:2018-08-24 19:11:08

标签: java exception custom-exceptions

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

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

我想通过创建自定义的异常来最小化throws关键字后的异常数量,如下所述:处理InstantiationExceptionIllegalAccessExceptionIllegalArgumentException在一起:

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

3 个答案:

答案 0 :(得分:3)

本着所问问题的精神:

您将必须捕获方法中的各种异常,然后从CustomException块中抛出catch。通过Exception类本身(请参见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子句中声明某种类型,该类型是可能实际引发的各种已检查异常的通用基类。例如,列表中的两个已检查异常都是ReflectiveOperationException的子类,因此您可以说

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

当然,要权衡的是,您对那些编写调用您的方法的代码的了解并不多,因此可能会限制其异常处理程序的质量。在极端情况下,您可以只说throws Thorwable,但这是很差的形式。

答案 1 :(得分:1)

您可以捕获每个抛出的异常,然后将其重新抛出自定义异常:

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

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

答案 2 :(得分:-1)

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

public class CustomException extends RuntimeException{

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

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

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

}