问题

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

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

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

"出现错误#1:访问数据库时出现问题。"

我的第一个想法是使用错误代码的Enum并覆盖toString方法以返回错误字符串。这是我想出的:

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 热门回答(141 赞)

那么enum解决方案肯定有更好的实现(通常非常好):

public enum Error {
DATABASE(0, "A database error has occured."),
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 热门回答(30 赞)

就我而言,我更喜欢将属性文件中的错误消息外部化。这对于应用程序的国际化(每种语言一个属性文件)非常有用。修改错误消息也更容易,并且不需要重新编译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行代码。想象一下,当你需要管理数百个错误时,你的Enumeration文件!

#3 热门回答(19 赞)

重载toString()似乎有点icky - 这似乎是toString()正常使用的一小部分。

关于什么:

public enum Errors {
DATABASE(1, "A database error has occured."),
DUPLICATE_USER(5007, "This user already exists.");
//... add more cases here ...
private final int id;
private final String message;
Errors(int id, String message) {
this.id = id;
this.message = message;
}
public int getId() { return id; }
public String getMessage() { return message; }
}

对我来说似乎更清洁......而且不那么冗长。