Java中定义错误码/字符串的最佳方法是什么?

140

我正在使用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)你真的需要在异常中使用错误代码吗?请参见下面blabla999的答案。2)传递太多错误信息给用户时应该小心。有用的错误信息应写入服务器日志,但客户端只应告知最少量(例如,“登录时出现问题”)。这是安全和防止欺骗者获得立足点的问题。 - wmorrison365
14个回答

0
请按照下面的示例进行操作:
public enum ErrorCodes {
NO_File("No file found. "),
private ErrorCodes(String value) { 
    this.errordesc = value; 
    }
private String errordesc = ""; 
public String errordesc() {
    return errordesc;
}
public void setValue(String errordesc) {
    this.errordesc = errordesc;
}

};

在你的代码中这样调用:

fileResponse.setErrorCode(ErrorCodes.NO_FILE.errordesc());

0

虽然枚举错误代码/消息定义仍然是一个不错的解决方案,但它存在国际化问题。实际上,我们可能有两种情况:代码/消息显示给最终用户或系统集成商。对于后一种情况,国际化并不是必要的。我认为Web服务很可能是后一种情况。


0

我使用PropertyResourceBundle来定义企业应用程序中的错误代码,以管理本地化错误代码资源。这是处理错误代码的最佳方式,而不是编写代码(可能适用于少量错误代码),当错误代码数量庞大且结构化时。

请查看Java文档以获取有关PropertyResourceBundle的更多信息。


0
我看了一些帖子,试图找到一个使用Spring RestControllers调用服务等方式实现JSON over HTTP后端API的好方法。虽然这是旧帖子,但我们做了以下事情:
我们定义了一个类似于这样的枚举:
public enum Error {   
   ERROR_0001("0001", "A %s is required for this operation."),   
   ERROR_0002("0002", "A %s is required."),   
   ERROR_0003("0003", "Widget number is required."),   
   ERROR_0004("0004", "Widget number can only be a max 16 characters in length."),
//more as needed

private final String code;   private final String description;   public static final String ERROR_CODE_PREFIX = "BCV";

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

  public String getDescription() {
    return description;   }

  public String getCode() {
    return code;   }

  public String getCodeWithPrefix() {...}

  public String getFormattedDescriptionWithCode(@Nullable Object... messageParameters) {...}

  public String getFormattedDescription(@Nullable Object... messageParameters) {...}

然后在Spring验证器中我们有:

  if (target == null) {
        errors.rejectValue(null, ERROR_0001.getCodeWithPrefix(),
                ERROR_0001.getFormattedDescriptionWithCode("Something"));
    }

而在异常处理中:

    @ControllerAdvice(annotations = RestController.class)
    @RequestMapping(produces = "application/vnd.error+json")
    @Component
    public class RestExceptionAdvice {
    
        @ExceptionHandler(Throwable.class)
        public ResponseEntity<JsonError> handleUnexpectedException(final Throwable t) {
            log.error(t.getMessage(), t);
            return new ResponseEntity<>(new JsonError("Unexpected error.", t.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);
        }
    
        @ExceptionHandler({
                BadArgumentsException.class
        })
        public ResponseEntity<JsonError> handleBadRequest(final Exception e) {
            log.error(e.getMessage(),e);
            return new ResponseEntity<>(new JsonError(e.getMessage(), e.getLocalizedMessage()), HttpStatus.BAD_REQUEST);
        }

        //handle exceptions from Spring Validators wired into controllers
        @ExceptionHandler({
                MethodArgumentNotValidException.class
        })
        public ResponseEntity<JsonError> handleValidationBadRequest(final 
              MethodArgumentNotValidException e) {

                log.error(e.getMessage(),e);
                ObjectError objectError = e.getBindingResult().getAllErrors().get(0);
                return new ResponseEntity<>(new JsonError(objectError.getDefaultMessage(), e.getLocalizedMessage()),HttpStatus.BAD_REQUEST);
        }
    //... more handler methods as needed

    //simple structure for frontend to handle
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    private class JsonError {
        private String message;
        private String details;
    }

然后在 UI 中(如 Angular 或其他框架)检查返回的错误是否有“message”字段,并在 Toastr / Error 弹出窗口中显示它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接