优化多类型异常的结构

This commit is contained in:
2025-01-10 17:39:41 +08:00
parent ac0f73f7f0
commit 55027d91ef
5 changed files with 117 additions and 104 deletions

View File

@@ -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&lt;LoginException, LoginException.Type&gt; {
* private final Type type;
* private LoginException(Type type, String message) {
* private LoginException(&#64;Nonnull Type type, &#64;Nonnull String message) {
* super(message);
* this.type = type;
* }
*
* private LoginException(Type type, Throwable cause) {
* private LoginException(&#64;Nonnull Type type, &#64;Nonnull Throwable cause) {
* super(cause);
* this.type = type;
* }
*
* private LoginException(Type type, String message, Throwable cause) {
* private LoginException(&#64;Nonnull Type type,
* &#64;Nonnull String message,
* &#64;Nonnull Throwable cause) {
* super(message, cause);
* this.type = type;
* }
*
* &#64;Override
* public &#64;Nonnull Type getType() {
* return this.type;
* }
*
* // ...
*
* public enum Type implements ExceptionType<LoginException> {
@@ -60,43 +75,38 @@ import xyz.zhouxy.plusone.commons.base.IWithCode;
* &#64;Nonnull
* private final String defaultMessage;
*
* Type(String code, String defaultMessage) {
* Type(&#64;Nonnull String code, &#64;Nonnull String defaultMessage) {
* this.code = code;
* this.defaultMessage = defaultMessage;
* }
*
* &#64;Override
* &#64;Nonnull
* public String getCode() {
* public &#64;Nonnull String getCode() {
* return code;
* }
*
* &#64;Override
* public String getDefaultMessage() {
* public &#64;Nonnull String getDefaultMessage() {
* return defaultMessage;
* }
*
* &#64;Override
* &#64;Nonnull
* public LoginException create() {
* public &#64;Nonnull LoginException create() {
* return new LoginException(this, this.defaultMessage);
* }
*
* &#64;Override
* &#64;Nonnull
* public LoginException create(String message) {
* public &#64;Nonnull LoginException create(String message) {
* return new LoginException(this, message);
* }
*
* &#64;Override
* &#64;Nonnull
* public LoginException create(Throwable cause) {
* public &#64;Nonnull LoginException create(Throwable cause) {
* return new LoginException(this, cause);
* }
*
* &#64;Override
* &#64;Nonnull
* public LoginException create(String message, Throwable cause) {
* public &#64;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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}