diff --git a/README.md b/README.md index c4981fc..6e03650 100644 --- a/README.md +++ b/README.md @@ -68,16 +68,16 @@ System.out.println(result); // Output: Return string `RegexConsts` 包含常见正则表达式;`PatternConsts` 包含对应的 `Pattern` 对象 ## 五、exception - 异常 -### 1. MultiTypesException - 多类型异常 +### 1. IMultiTypesException - 多类型异常 异常在不同场景下被抛出,可以用不同的枚举值,表示不同的场景类型。 -异常实现 `MultiTypesException` 的 `MultiTypesException#getType` 方法,返回对应的场景类型。 +异常实现 `IMultiTypesException` 的 `IMultiTypesException#getType` 方法,返回对应的场景类型。 -表示场景类型的枚举实现 `MultiTypesException.ExceptionType`,其中的工厂方法用于创建对应类型的异常。 +表示场景类型的枚举实现 `IMultiTypesException.IExceptionType`,其中的工厂方法用于创建对应类型的异常。 ```java public final class LoginException extends RuntimeException - implements MultiTypesException { + implements IMultiTypesException { private static final long serialVersionUID = 881293090625085616L; private final Type type; private LoginException(@Nonnull Type type, @Nonnull String message) { @@ -104,7 +104,7 @@ public final class LoginException // ... - public enum Type implements ExceptionType { + public enum Type implements IExceptionType { DEFAULT("00", "当前会话未登录"), NOT_TOKEN("10", "未提供token"), INVALID_TOKEN("20", "token无效"), diff --git a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/IExceptionFactory.java b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/IExceptionFactory.java new file mode 100644 index 0000000..655921f --- /dev/null +++ b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/IExceptionFactory.java @@ -0,0 +1,61 @@ +/* + * 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package xyz.zhouxy.plusone.commons.exception; + +import javax.annotation.Nonnull; + +/** + * 异常工厂 + * + * @author ZhouXY + */ +public interface IExceptionFactory { + /** + * 创建异常 + * + * @return 异常对象 + */ + @Nonnull + X create(); + + /** + * 使用指定 {@code message} 创建异常 + * + * @param message 异常信息 + * @return 异常对象 + */ + @Nonnull + X create(String message); + + /** + * 使用指定 {@code cause} 创建异常 + * + * @param cause 包装的异常 + * @return 异常对象 + */ + @Nonnull + X create(Throwable cause); + + /** + * 使用指定 {@code message} 和 {@code cause} 创建异常 + * + * @param message 异常信息 + * @param cause 包装的异常 + * @return 异常对象 + */ + @Nonnull + X create(String message, Throwable cause); +} diff --git a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/MultiTypesException.java b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/IMultiTypesException.java similarity index 71% rename from plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/MultiTypesException.java rename to plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/IMultiTypesException.java index 159997b..7ac279c 100644 --- a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/MultiTypesException.java +++ b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/IMultiTypesException.java @@ -15,26 +15,30 @@ */ package xyz.zhouxy.plusone.commons.exception; +import java.io.Serializable; + import javax.annotation.Nonnull; +import xyz.zhouxy.plusone.commons.annotation.Virtual; import xyz.zhouxy.plusone.commons.base.IWithCode; /** - * MultiTypesException + * IMultiTypesException * *

* 异常在不同场景下被抛出,可以用不同的枚举值,表示不同的场景类型。 * *

- * 异常实现 {@link MultiTypesException} 的 {@link #getType} 方法,返回对应的场景类型。 + * 异常实现 {@link IMultiTypesException} 的 {@link #getType} 方法,返回对应的场景类型。 * *

- * 表示场景类型的枚举实现 {@link ExceptionType},其中的工厂方法用于创建对应类型的异常。 + * 表示场景类型的枚举实现 {@link IExceptionType},各个枚举值本身就是该场景的异常的工厂实例, + * 使用其中的工厂方法用于创建对应类型的异常。 * *

  * public final class LoginException
  *         extends RuntimeException
- *         implements MultiTypesException<LoginException, LoginException.Type> {
+ *         implements IMultiTypesException<LoginException, LoginException.Type, String> {
  *     private static final long serialVersionUID = 881293090625085616L;
  *     private final Type type;
  *     private LoginException(@Nonnull Type type, @Nonnull String message) {
@@ -61,7 +65,7 @@ import xyz.zhouxy.plusone.commons.base.IWithCode;
  *
  *     // ...
  *
- *     public enum Type implements ExceptionType<LoginException> {
+ *     public enum Type implements IExceptionType<LoginException, String> {
  *         DEFAULT("00", "当前会话未登录"),
  *         NOT_TOKEN("10", "未提供token"),
  *         INVALID_TOKEN("20", "token无效"),
@@ -118,15 +122,20 @@ import xyz.zhouxy.plusone.commons.base.IWithCode;
  * throw LoginException.Type.TOKEN_TIMEOUT.create();
  * 
* + * @param 具体异常类 + * @param 异常场景 * @author ZhouXY * @since 1.0.0 */ -public interface MultiTypesException> { +public interface IMultiTypesException< + X extends Exception, + T extends IMultiTypesException.IExceptionType, + TCode extends Serializable> { /** * 异常类型 * - * @return 异常类型。通常是实现了 {@link ExceptionType} 的枚举。 + * @return 异常类型。通常是实现了 {@link IExceptionType} 的枚举。 */ @Nonnull T getType(); @@ -136,55 +145,25 @@ public interface MultiTypesException extends IWithCode { + public static interface IExceptionType + extends IWithCode, IExceptionFactory { /** * 默认异常信息 */ String getDefaultMessage(); - /** - * 创建异常 - * - * @return 异常对象 - */ - @Nonnull - E create(); - - /** - * 使用指定 {@code message} 创建异常 - * - * @param message 异常信息 - * @return 异常对象 - */ - @Nonnull - E create(String message); - - /** - * 使用指定 {@code cause} 创建异常 - * - * @param cause 包装的异常 - * @return 异常对象 - */ - @Nonnull - E create(Throwable cause); - - /** - * 使用指定 {@code message} 和 {@code cause} 创建异常 - * - * @param message 异常信息 - * @param cause 包装的异常 - * @return 异常对象 - */ - @Nonnull - E create(String message, Throwable cause); + @Virtual + default String getDescription() { + return getDefaultMessage(); + } } } diff --git a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/ParsingFailureException.java b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/ParsingFailureException.java index 3aac49f..0f86910 100644 --- a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/ParsingFailureException.java +++ b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/ParsingFailureException.java @@ -21,7 +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; +import xyz.zhouxy.plusone.commons.exception.IMultiTypesException.IExceptionType; /** * 解析失败异常 @@ -39,7 +39,7 @@ import xyz.zhouxy.plusone.commons.exception.MultiTypesException.ExceptionType; */ public final class ParsingFailureException extends Exception - implements MultiTypesException { + implements IMultiTypesException { private static final long serialVersionUID = 795996090625132616L; private final Type type; @@ -171,7 +171,7 @@ public final class ParsingFailureException /** XML 解析失败 */ public static final Type XML_PARSING_FAILURE = Type.XML_PARSING_FAILURE; - public enum Type implements ExceptionType { + public enum Type implements IExceptionType { DEFAULT("00", "解析失败"), NUMBER_PARSING_FAILURE("10", "数字转换失败"), DATE_TIME_PARSING_FAILURE("20", "时间解析失败"), diff --git a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/business/InvalidInputException.java b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/business/InvalidInputException.java index 301e0ef..b739c82 100644 --- a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/business/InvalidInputException.java +++ b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/business/InvalidInputException.java @@ -18,8 +18,8 @@ package xyz.zhouxy.plusone.commons.exception.business; import javax.annotation.Nonnull; -import xyz.zhouxy.plusone.commons.exception.MultiTypesException.ExceptionType; -import xyz.zhouxy.plusone.commons.exception.MultiTypesException; +import xyz.zhouxy.plusone.commons.exception.IMultiTypesException.IExceptionType; +import xyz.zhouxy.plusone.commons.exception.IMultiTypesException; /** * InvalidInputException @@ -35,7 +35,7 @@ import xyz.zhouxy.plusone.commons.exception.MultiTypesException; */ public final class InvalidInputException extends RequestParamsException - implements MultiTypesException { + implements IMultiTypesException { private static final long serialVersionUID = -28994090625082516L; private final Type type; @@ -109,7 +109,7 @@ public final class InvalidInputException return this.type; } - public enum Type implements ExceptionType { + public enum Type implements IExceptionType { DEFAULT("00", "用户输入内容非法"), CONTAINS_ILLEGAL_AND_MALICIOUS_LINKS("01", "包含非法恶意跳转链接"), CONTAINS_ILLEGAL_WORDS("02", "包含违禁敏感词"), diff --git a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/package-info.java b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/package-info.java index b956736..0ba9d8a 100644 --- a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/package-info.java +++ b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/exception/package-info.java @@ -17,20 +17,21 @@ /** *

异常

* - *

1. {@link MultiTypesException} - 多类型异常

+ *

1. {@link IMultiTypesException} - 多类型异常

*

* 异常在不同场景下被抛出,可以用不同的枚举值,表示不同的场景类型。 * *

- * 异常实现 {@link MultiTypesException} 的 {@link MultiTypesException#getType} 方法,返回对应的场景类型。 + * 异常实现 {@link IMultiTypesException} 的 {@link IMultiTypesException#getType} 方法,返回对应的场景类型。 * *

- * 表示场景类型的枚举实现 {@link MultiTypesException.ExceptionType},其中的工厂方法用于创建对应类型的异常。 + * 表示场景类型的枚举实现 {@link IMultiTypesException.IExceptionType},各个枚举值本身就是该场景的异常的工厂实例, + * 使用其中的工厂方法用于创建对应类型的异常。 * *

  * public final class LoginException
  *         extends RuntimeException
- *         implements MultiTypesException<LoginException, LoginException.Type> {
+ *         implements IMultiTypesException<LoginException, LoginException.Type, String> {
  *     private static final long serialVersionUID = 881293090625085616L;
  *     private final Type type;
  *     private LoginException(@Nonnull Type type, @Nonnull String message) {
@@ -57,7 +58,7 @@
  *
  *     // ...
  *
- *     public enum Type implements ExceptionType<LoginException> {
+ *     public enum Type implements IExceptionType<LoginException, String> {
  *         DEFAULT("00", "当前会话未登录"),
  *         NOT_TOKEN("10", "未提供token"),
  *         INVALID_TOKEN("20", "token无效"),