在Java中定义错误代码/字符串的最佳方法?

2022-08-31 08:21:40

我正在用Java编写Web服务,我试图找出定义错误代码及其相关错误字符串的最佳方法。我需要将数字错误代码和错误字符串组合在一起。错误代码和错误字符串都将发送到访问 Web 服务的客户端。例如,当发生 SQLException 时,我可能要执行以下操作:

// Example: errorCode = 1, 
//          errorString = "There was a problem accessing the database."
throw new SomeWebServiceException(errorCode, errorString);

客户端程序可能会显示以下消息:

“发生错误 #1:访问数据库时出现问题。

我的第一个想法是使用一个错误代码并重写方法以返回错误字符串。以下是我想出的:EnumtoString

public enum Errors {
  DATABASE {
    @Override
    public String toString() {
      return "A database error has occured.";
    }
  },

  DUPLICATE_USER {
    @Override
    public String toString() {
      return "This user already exists.";
    }
  },

  // more errors follow
}

我的问题是:有没有更好的方法来做到这一点?我更喜欢代码中的解决方案,而不是从外部文件中读取。我正在使用Javadoc进行此项目,并且能够内联记录错误代码并在文档中自动更新它们将很有帮助。


答案 1

嗯,枚举解决方案肯定有更好的实现(这通常很不错):

public enum Error {
  DATABASE(0, "A database error has occurred."),
  DUPLICATE_USER(1, "This user already exists.");

  private final int code;
  private final String description;

  private Error(int code, String description) {
    this.code = code;
    this.description = description;
  }

  public String getDescription() {
     return description;
  }

  public int getCode() {
     return code;
  }

  @Override
  public String toString() {
    return code + ": " + description;
  }
}

您可能希望覆盖 toString() 以仅返回描述 - 不确定。无论如何,重点是您不需要为每个错误代码单独覆盖。另请注意,我已经显式指定了代码而不是使用序号值 - 这使得以后更改顺序和添加/删除错误变得更加容易。

不要忘记,这根本不是国际化的 - 但除非你的Web服务客户端向你发送区域设置描述,否则你无论如何都不能轻松地自己将其国际化。至少他们会有错误代码在客户端用于i18n...


答案 2

就我而言,我更喜欢将属性文件中的错误消息外部化。在应用程序国际化的情况下(每种语言一个属性文件),这将非常有用。修改错误消息也更容易,并且不需要对Java源代码进行任何重新编译。

在我的项目中,通常我有一个包含错误代码(字符串或整数,它不太关心)的接口,其中包含此错误的属性文件中的键:

public interface ErrorCodes {
    String DATABASE_ERROR = "DATABASE_ERROR";
    String DUPLICATE_USER = "DUPLICATE_USER";
    ...
}

在属性文件中:

DATABASE_ERROR=An error occurred in the database.
DUPLICATE_USER=The user already exists.
...

您的解决方案的另一个问题是可维护性:您只有2个错误,并且已经有12行代码。因此,想象一下您的枚举文件,当您有数百个错误需要管理时!