forked from plusone/plusone-commons
优化多类型异常的结构
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2024 the original author or authors.
|
||||
* Copyright 2025 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -20,30 +20,45 @@ import javax.annotation.Nonnull;
|
||||
import xyz.zhouxy.plusone.commons.base.IWithCode;
|
||||
|
||||
/**
|
||||
* 异常类型
|
||||
* MultiTypesException
|
||||
*
|
||||
* <p>
|
||||
* 异常在不同场景下被抛出,可以用不同的枚举值,表示不同的异常类型。
|
||||
* 该枚举实现本接口,用于基于不同类型创建异常。
|
||||
* 异常在不同场景下被抛出,可以用不同的枚举值,表示不同的场景类型。
|
||||
* </p>
|
||||
* <p>
|
||||
* 异常实现 {@link MultiTypesException} 的 {@link #getType} 方法,返回对应的场景类型。
|
||||
* </p>
|
||||
* <p>
|
||||
* 表示场景类型的枚举实现 {@link ExceptionType},其中的工厂方法用于创建类型对象。
|
||||
* </p>
|
||||
*
|
||||
* <pre>
|
||||
* public final class LoginException extends RuntimeException {
|
||||
* public final class LoginException
|
||||
* extends RuntimeException
|
||||
* implements MultiTypesException<LoginException, LoginException.Type> {
|
||||
* private final Type type;
|
||||
* private LoginException(Type type, String message) {
|
||||
* private LoginException(@Nonnull Type type, @Nonnull String message) {
|
||||
* super(message);
|
||||
* this.type = type;
|
||||
* }
|
||||
*
|
||||
* private LoginException(Type type, Throwable cause) {
|
||||
* private LoginException(@Nonnull Type type, @Nonnull Throwable cause) {
|
||||
* super(cause);
|
||||
* this.type = type;
|
||||
* }
|
||||
*
|
||||
* private LoginException(Type type, String message, Throwable cause) {
|
||||
* private LoginException(@Nonnull Type type,
|
||||
* @Nonnull String message,
|
||||
* @Nonnull Throwable cause) {
|
||||
* super(message, cause);
|
||||
* this.type = type;
|
||||
* }
|
||||
*
|
||||
* @Override
|
||||
* public @Nonnull Type getType() {
|
||||
* return this.type;
|
||||
* }
|
||||
*
|
||||
* // ...
|
||||
*
|
||||
* public enum Type implements ExceptionType<LoginException> {
|
||||
@@ -60,43 +75,38 @@ import xyz.zhouxy.plusone.commons.base.IWithCode;
|
||||
* @Nonnull
|
||||
* private final String defaultMessage;
|
||||
*
|
||||
* Type(String code, String defaultMessage) {
|
||||
* Type(@Nonnull String code, @Nonnull String defaultMessage) {
|
||||
* this.code = code;
|
||||
* this.defaultMessage = defaultMessage;
|
||||
* }
|
||||
*
|
||||
* @Override
|
||||
* @Nonnull
|
||||
* public String getCode() {
|
||||
* public @Nonnull String getCode() {
|
||||
* return code;
|
||||
* }
|
||||
*
|
||||
* @Override
|
||||
* public String getDefaultMessage() {
|
||||
* public @Nonnull String getDefaultMessage() {
|
||||
* return defaultMessage;
|
||||
* }
|
||||
*
|
||||
* @Override
|
||||
* @Nonnull
|
||||
* public LoginException create() {
|
||||
* public @Nonnull LoginException create() {
|
||||
* return new LoginException(this, this.defaultMessage);
|
||||
* }
|
||||
*
|
||||
* @Override
|
||||
* @Nonnull
|
||||
* public LoginException create(String message) {
|
||||
* public @Nonnull LoginException create(String message) {
|
||||
* return new LoginException(this, message);
|
||||
* }
|
||||
*
|
||||
* @Override
|
||||
* @Nonnull
|
||||
* public LoginException create(Throwable cause) {
|
||||
* public @Nonnull LoginException create(Throwable cause) {
|
||||
* return new LoginException(this, cause);
|
||||
* }
|
||||
*
|
||||
* @Override
|
||||
* @Nonnull
|
||||
* public LoginException create(String message, Throwable cause) {
|
||||
* public @Nonnull LoginException create(String message, Throwable cause) {
|
||||
* return new LoginException(this, message, cause);
|
||||
* }
|
||||
* }
|
||||
@@ -110,21 +120,32 @@ import xyz.zhouxy.plusone.commons.base.IWithCode;
|
||||
* </p>
|
||||
*
|
||||
* @author <a href="http://zhouxy.xyz:3000/ZhouXY108}">ZhouXY</a>
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public interface ExceptionType<E extends Exception> extends IWithCode<String> {
|
||||
|
||||
String getDefaultMessage();
|
||||
public interface MultiTypesException<E extends Exception, T extends MultiTypesException.ExceptionType<E>> {
|
||||
|
||||
@Nonnull
|
||||
E create();
|
||||
T getType();
|
||||
|
||||
@Nonnull
|
||||
E create(String message);
|
||||
default @Nonnull String getTypeCode() {
|
||||
return getType().getCode();
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
E create(Throwable cause);
|
||||
public static interface ExceptionType<E extends Exception> extends IWithCode<String> {
|
||||
|
||||
@Nonnull
|
||||
E create(String message, Throwable cause);
|
||||
String getDefaultMessage();
|
||||
|
||||
@Nonnull
|
||||
E create();
|
||||
|
||||
@Nonnull
|
||||
E create(String message);
|
||||
|
||||
@Nonnull
|
||||
E create(Throwable cause);
|
||||
|
||||
@Nonnull
|
||||
E create(String message, Throwable cause);
|
||||
|
||||
}
|
||||
}
|
@@ -21,6 +21,7 @@ import java.time.format.DateTimeParseException;
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import xyz.zhouxy.plusone.commons.exception.business.RequestParamsException;
|
||||
import xyz.zhouxy.plusone.commons.exception.MultiTypesException.ExceptionType;
|
||||
|
||||
/**
|
||||
* 解析失败异常
|
||||
@@ -37,7 +38,9 @@ import xyz.zhouxy.plusone.commons.exception.business.RequestParamsException;
|
||||
* @author <a href="http://zhouxy.xyz:3000/ZhouXY108">ZhouXY</a>
|
||||
* @since 0.1.0
|
||||
*/
|
||||
public final class ParsingFailureException extends RuntimeException {
|
||||
public final class ParsingFailureException
|
||||
extends RuntimeException
|
||||
implements MultiTypesException<ParsingFailureException, ParsingFailureException.Type> {
|
||||
|
||||
private final Type type;
|
||||
|
||||
@@ -94,14 +97,12 @@ public final class ParsingFailureException extends RuntimeException {
|
||||
return Type.NUMBER_PARSING_FAILURE.create(message, cause);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public Type getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getCode() {
|
||||
return this.type.code;
|
||||
}
|
||||
|
||||
public static final Type DEFAULT = Type.DEFAULT;
|
||||
public static final Type NUMBER_PARSING_FAILURE = Type.NUMBER_PARSING_FAILURE;
|
||||
public static final Type DATE_TIME_PARSING_FAILURE = Type.DATE_TIME_PARSING_FAILURE;
|
||||
@@ -127,37 +128,32 @@ public final class ParsingFailureException extends RuntimeException {
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public String getCode() {
|
||||
public @Nonnull String getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDefaultMessage() {
|
||||
public @Nonnull String getDefaultMessage() {
|
||||
return defaultMessage;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public ParsingFailureException create() {
|
||||
public @Nonnull ParsingFailureException create() {
|
||||
return new ParsingFailureException(this, this.defaultMessage);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public ParsingFailureException create(String message) {
|
||||
public @Nonnull ParsingFailureException create(String message) {
|
||||
return new ParsingFailureException(this, message);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public ParsingFailureException create(Throwable cause) {
|
||||
public @Nonnull ParsingFailureException create(Throwable cause) {
|
||||
return new ParsingFailureException(this, cause);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public ParsingFailureException create(String message, Throwable cause) {
|
||||
public @Nonnull ParsingFailureException create(String message, Throwable cause) {
|
||||
return new ParsingFailureException(this, message, cause);
|
||||
}
|
||||
}
|
||||
|
@@ -18,7 +18,8 @@ package xyz.zhouxy.plusone.commons.exception.business;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import xyz.zhouxy.plusone.commons.exception.ExceptionType;
|
||||
import xyz.zhouxy.plusone.commons.exception.MultiTypesException.ExceptionType;
|
||||
import xyz.zhouxy.plusone.commons.exception.MultiTypesException;
|
||||
|
||||
/**
|
||||
* InvalidInputException
|
||||
@@ -33,7 +34,9 @@ import xyz.zhouxy.plusone.commons.exception.ExceptionType;
|
||||
* @author <a href="http://zhouxy.xyz:3000/ZhouXY108">ZhouXY</a>
|
||||
* @since 0.1.0
|
||||
*/
|
||||
public final class InvalidInputException extends RequestParamsException {
|
||||
public final class InvalidInputException
|
||||
extends RequestParamsException
|
||||
implements MultiTypesException<InvalidInputException, InvalidInputException.Type> {
|
||||
|
||||
private final Type type;
|
||||
|
||||
@@ -73,14 +76,12 @@ public final class InvalidInputException extends RequestParamsException {
|
||||
this(Type.DEFAULT, message, cause);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public Type getType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
public Object getCode() {
|
||||
return this.type.code;
|
||||
}
|
||||
|
||||
public enum Type implements ExceptionType<InvalidInputException> {
|
||||
DEFAULT("00", "用户输入内容非法"),
|
||||
CONTAINS_ILLEGAL_AND_MALICIOUS_LINKS("01", "包含非法恶意跳转链接"),
|
||||
@@ -90,9 +91,9 @@ public final class InvalidInputException extends RequestParamsException {
|
||||
;
|
||||
|
||||
@Nonnull
|
||||
final String code;
|
||||
private final String code;
|
||||
@Nonnull
|
||||
final String defaultMessage;
|
||||
private final String defaultMessage;
|
||||
|
||||
Type(String code, String defaultMsg) {
|
||||
this.code = code;
|
||||
@@ -100,37 +101,32 @@ public final class InvalidInputException extends RequestParamsException {
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public String getCode() {
|
||||
public @Nonnull String getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDefaultMessage() {
|
||||
public @Nonnull String getDefaultMessage() {
|
||||
return defaultMessage;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public InvalidInputException create() {
|
||||
public @Nonnull InvalidInputException create() {
|
||||
return new InvalidInputException(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public InvalidInputException create(String message) {
|
||||
public @Nonnull InvalidInputException create(String message) {
|
||||
return new InvalidInputException(this, message);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public InvalidInputException create(Throwable cause) {
|
||||
public @Nonnull InvalidInputException create(Throwable cause) {
|
||||
return new InvalidInputException(this, cause);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public InvalidInputException create(String message, Throwable cause) {
|
||||
public @Nonnull InvalidInputException create(String message, Throwable cause) {
|
||||
return new InvalidInputException(this, message, cause);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user