【问题标题】:Having Multiple Exception classes aren't like Redundant, especially when we are using Error Codes?拥有多个异常类不像冗余,尤其是当我们使用错误代码时?
【发布时间】:2020-08-13 07:24:18
【问题描述】:

我在我们的应用程序中使用 Spring Boot 和 Spring Rest。

我的查询是:在我们的应用程序中,我们使用错误代码以及创建多个异常类。那么,当我们已经使用自定义错误代码时,再次创建多个异常类有什么意义呢?我想为整个应用程序(比如 AppException)只创建一个自定义异常类,应该足以显示使用错误代码的各种错误场景的错误响应。

好的,即使对于日志,我们也可以显示相同的异常(即 AppException)并在日志本身中显示错误代码。那么当任何 RunTimeException 发生时,通过查看日志中的 Error Codes 和相应的 Error Messages,我们就会知道真正的原因是什么,对吧?

那么,拥有多个异常类不像冗余,尤其是当我们使用错误代码时?

如果我错了,请提出您的想法。

编辑: 仅供参考,下面是我的 CustomException,它以错误代码为参数

import java.util.Arrays;

public class MyAppException extends RuntimeException {
    private final MyAppErrorCodes errorCode;
    private final Object[] errorCodeArgs;

    public MyAppException(final MyAppErrorCodes errorCode, final Throwable cause, final Object... args) {
        super(cause);
        this.errorCode = errorCode;
        this.errorCodeArgs = Arrays.copyOf(args, args.length);
    }

    public MyAppErrorCodes getErrorCode() {
        return errorCode;
    }

    public Object[] getErrorCodeArgs() {
        return errorCodeArgs.clone();
    }
}

【问题讨论】:

  • 错误代码在哪里使用?方法会返回它们而不是抛出异常吗?
  • @codebrane 在抛出异常时,我们会将 ErrorCode 作为参数传递。
  • 我还在寻找更多答案..
  • 您的系统中如何使用错误代码?你拿他们做什么?
  • 错误代码用于显示 UI 响应和日志

标签: spring-boot rest spring-mvc exception


【解决方案1】:

如果您有通用应用程序异常,例如

class ApplicationException extends Exception {
  ...
  private int errorCode; // with getter and setter
}

异常情况的真正含义编码在ApplicationException.errorCode中,例如4839238756

这仅对我认为的开发人员有意义,并且可能与非常具体的错误条件有关,例如cannot create new resource

您可以将含义提取到更高级别并使用多个异常类,例如

class ResourceException extends ApplicationException {
  ...
}

class NetworkException extends ApplicationException {
  ...
}

然后将问题分类到应用程序中的不同功能区域,并可以记录到不同的问题日志文件中。具体原因还是可以编码在errorCode中。

这取决于您是否要在链条的上游处理异常,例如为不同类型的异常(例如数据库错误、网络错误等)提供单独的日志文件,而不是从其errorCode 中确定它是什么类型的异常。

需要修复网络异常的开发人员可以专注于那些,因为只有那些记录到 issues.network.log,每个 errorCode 都会进一步缩小范围,但在该异常类型的上下文中。

如果您正在登录到数据库,您可以查询所有 NetworkExceptions 而不是 errorCode 的范围,例如234342898987 之间的所有 errorCode,如果您要将 errorCode 划分为功能区域。

【讨论】:

  • 可能是我的查询没有向您清除.. 我刚刚更新了我的查询,请您看一下..
【解决方案2】:

出于某种原因,两者都可以使用。

在大多数情况下,使用多个异常对系统的错误处理更好,因为 java 处理它(try-catch)。

对于调用方来说,现在使用错误代码可能会很有趣。假设您希望对错误的原因进行细粒度分析。对于所有非法输入,您将返回 400 错误请求。但您可以使用业务错误代码丰富您的响应。

例子:

  • Http 400,错误代码001(需要姓氏)
  • Http 400,错误代码 002(姓氏太长) ...

对于调用方来说,解释错误代码而不是错误消息会很简单

这实际上是我们使用 SOAP 推送错误详细信息的方式。

错误代码也很有趣,可以丰富日志消息以供进一步调试。

所以关于你的问题:

那么,拥有多个异常类并不像冗余,尤其是当我们使用错误代码时?

没有。两者都使用是完全合理的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多