14

您认为可以在异常中使用错误代码来指定错误类型吗?请看一下这段代码:

public class MyException extends Exception {
    public static final String ERROR_CODE_INVALID_NAME = "";
    public static final String ERROR_CODE_INVALID_ID = "";
    ...

    private String errorCode;

    public MyException(String message, String errorCode) {
        super(message);
        this.errorCode = errorCode;
    }

    public String getErrorCode() {
        return errorCode;
    }
}

我知道在这个例子中使用枚举而不是字符串更好,但我实际上关心错误代码的概念。您认为异常层次结构在这里会更好吗?我找不到任何权威来源说异常中的错误代码是反模式。谢谢。

4

5 回答 5

8

错误代码在以下情况下很有用

  • 您无法显示完整的错误消息(洗碗机显示)
  • 代码必须在内部处理(如果出现特定代码或服务器向客户端发送错误代码而客户端负责消息,则会触发一些逻辑)
  • 我们有一本很棒的手册,用户可以使用代码来获取全面的信息
  • 用户不需要知道发生了什么,但必须联系供应商

所以,大多数时候,我在错误代码中看不到任何附加值。我更喜欢在日志文件中找到的异常层次结构或至少清晰的错误消息(即使在程序员离开公司后 2 年)。

如果您对错误代码有要求 - 解决方案还不错。考虑在中央存储库(属性文件)中收集所有错误代码,以便您可以轻松地交换完整集:

myexception.ERROR_CODE_INVALID_NAME=text or number
myexception.ERROR_CODE_INVALID_ID=text or number
于 2012-02-15T10:48:24.770 回答
4

根据我的经验,异常代码主要用作用户的信息消息。

我什至没有看到有人尝试解析一般异常消息以做出不同的反应,这取决于错误代码,通常是通过异常层次结构完成的。

另一方面,可能很难为每个特定情况创建新的异常子类,然后使用异常代码。
例如,如果对于用户代码,它没有衡量事务失败的原因,它应该以任何方式回滚它,但对于最终用户来说,重要的是它发生的原因(错误的参数、数据库连接或其他)。

因此,总而言之,如果您希望以不同的方式处理不同的情况,最好使用不同的异常类型,但如果您应该以相同的方式处理少量问题但只通知用户特定原因,则使用异常代码更容易。

于 2012-06-29T16:46:48.820 回答
3

我通常使用两者的组合。

您需要对异常进行分类并做出设计决策。

例如,您可以使用异常来源、类型、影响和处理等参数来对异常进行分类。如果异常属于同一类别,请使用其中的错误代码。对属于不同类别的异常使用层次结构。

如果您选择异常处理作为一个重要参数,您可以根据自己的处理方式在两个选项之间进行选择:

  1. 如果您想在一个 catch 块中捕获所有类型并以通用方式处理它们,请使用错误代码。
  2. 如果您想一次捕获特定类型并相应地处理它们,请使用层次结构。
于 2012-02-15T10:53:39.040 回答
2

在性能方面,从内存和时间方面创建复杂异常层次结构的堆栈跟踪都非常昂贵,因此,如果您为可以通过 3-4 个静态错误代码解决的问题创建复杂的自定义异常层次结构......我更喜欢错误代码选项。一般来说,我更喜欢使用运行时异常(未在方法签名中检查),捕获已检查异常的防御方法有点过时 IMO。

于 2012-02-15T10:52:34.240 回答
1

如果您想根据导致异常的原因(无效名称或无效 ID)做出不同的反应(在代码中),那么我建议您使用不同的异常。

如果没有,那么您甚至不需要该getErrorCode()方法,您只需将错误代码添加到异常消息中,异常将为您提供调试所需的所有信息。

于 2012-02-15T10:53:15.427 回答