如何创建在 java 中包含多个异常的自定义异常
How to create a custom exception which wraps mutliple exceptions in java
如何创建自定义异常来包装三个不同的异常,如 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
}
本着提问的精神:
您必须捕获方法中的各种异常,然后从 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
才能被抛出。
如何创建自定义异常来包装三个不同的异常,如 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
}
本着提问的精神:
您必须捕获方法中的各种异常,然后从 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
才能被抛出。