如何为 java 中的多个异常编写自定义异常?
How to write custom excetion for Mutilple exceptions in java?
我正在使用抛出 MessageException 和 IOException
的 smtp api
但是在我们的应用程序中,我们需要为两者设置包装器异常。
是否可以为此编写包装器异常?喜欢自定义异常?
当然可以。例外就是,并且可以包装任何东西;您不需要将它们写成专门包装 IOException 或 MessageExceptions。
public class MyCustomException extends Exception {
public MyCustomException(String msg) {
super(msg);
}
public MyCustomException(String msg, Throwable cause) {
super(msg, cause);
}
}
以上是 所有 自定义异常的样子(在相关的地方,它们可能有更多字段为特定故障注册特定信息,例如 SQLException 有方法来请求DB 'error code'), 但他们至少都具备以上条件
然后,换行:
public void myMethod() throws MyException {
try {
stuffThatThrowsIOEx();
stuffThatThrowsMessageEx();
} catch (MessageException | IOException e) {
throw new MyException("Cannot send foo", e);
}
}
注意:您传递给 MyException
的字符串应该很短,不应使用大写字母或感叹号,也不应在末尾使用任何其他标点符号。此外,还包括实际的相关内容:例如,您尝试为其发送消息的用户(关键是,无论您作为字符串常量包括在其中的什么都需要简单、简短且不以标点符号结尾)。
考虑创建一个根异常容器作为
public class GeneralExceptionContainer extends RuntimeException{
private Integer exceptionCode;
private String message;
public GeneralExceptionContainer(String argMessage, Integer exceptionCode) {
super(argMessage);
this.exceptionCode = exceptionCode;
this.message = argMessage;
}
public GeneralExceptionContainer(Throwable cause, Integer exceptionCode, String argMessage) {
super(argMessage, cause);
this.exceptionCode = exceptionCode;
this.message = argMessage;
}
}
对于某些枚举或序列化要求,您也可以添加 exceptionCode
public enum ExceptionCode {
SECTION_LOCKED(-0),
MAPPING_EXCEPTION(-110)
private final int value;
public int getValue() {
return this.value;
}
ExceptionCode(int value) {
this.value = value;
}
public static ExceptionCode findByName(String name) {
for (ExceptionCode v : values()) {
if (v.name().equals(name)) {
return v;
}
}
return null;
}
}
然后从根 GeneralException 容器扩展您的 customException
public class CustomException extends GeneralExceptionContainer {
public MappingException(ExceptionCode exceptionCode) {
super(exceptionCode.name(), exceptionCode.getValue());
}
}
我正在使用抛出 MessageException 和 IOException
的 smtp api但是在我们的应用程序中,我们需要为两者设置包装器异常。
是否可以为此编写包装器异常?喜欢自定义异常?
当然可以。例外就是,并且可以包装任何东西;您不需要将它们写成专门包装 IOException 或 MessageExceptions。
public class MyCustomException extends Exception {
public MyCustomException(String msg) {
super(msg);
}
public MyCustomException(String msg, Throwable cause) {
super(msg, cause);
}
}
以上是 所有 自定义异常的样子(在相关的地方,它们可能有更多字段为特定故障注册特定信息,例如 SQLException 有方法来请求DB 'error code'), 但他们至少都具备以上条件
然后,换行:
public void myMethod() throws MyException {
try {
stuffThatThrowsIOEx();
stuffThatThrowsMessageEx();
} catch (MessageException | IOException e) {
throw new MyException("Cannot send foo", e);
}
}
注意:您传递给 MyException
的字符串应该很短,不应使用大写字母或感叹号,也不应在末尾使用任何其他标点符号。此外,还包括实际的相关内容:例如,您尝试为其发送消息的用户(关键是,无论您作为字符串常量包括在其中的什么都需要简单、简短且不以标点符号结尾)。
考虑创建一个根异常容器作为
public class GeneralExceptionContainer extends RuntimeException{
private Integer exceptionCode;
private String message;
public GeneralExceptionContainer(String argMessage, Integer exceptionCode) {
super(argMessage);
this.exceptionCode = exceptionCode;
this.message = argMessage;
}
public GeneralExceptionContainer(Throwable cause, Integer exceptionCode, String argMessage) {
super(argMessage, cause);
this.exceptionCode = exceptionCode;
this.message = argMessage;
}
}
对于某些枚举或序列化要求,您也可以添加 exceptionCode
public enum ExceptionCode {
SECTION_LOCKED(-0),
MAPPING_EXCEPTION(-110)
private final int value;
public int getValue() {
return this.value;
}
ExceptionCode(int value) {
this.value = value;
}
public static ExceptionCode findByName(String name) {
for (ExceptionCode v : values()) {
if (v.name().equals(name)) {
return v;
}
}
return null;
}
}
然后从根 GeneralException 容器扩展您的 customException
public class CustomException extends GeneralExceptionContainer {
public MappingException(ExceptionCode exceptionCode) {
super(exceptionCode.name(), exceptionCode.getValue());
}
}