如何创建一个自定义异常,该异常包装了三个不同的异常,例如InvalidContextException
,IllegalArgumentException
。例如,假设有一个方法:
public void method() throws IOException, IllegalArgumentException,
InstantiationException, IllegalAccessException {
//Body of the method
}
我想通过创建自定义的异常来最小化throws关键字后的异常数量,如下所述:处理InstantiationException
和IllegalAccessException
和IllegalArgumentException
在一起:
public void method() throws IOException, CustomException {
//Body of the method
}
答案 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);
}
}