如何为 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());
    }
}