4

我正在为我们的客户开发 RESTful API。
如果发生错误,我将显示错误信息。
错误信息协议如下所示。

{ 
    "status": "failure",
    "error": {
        "message": "", 
        "type": "",
        "code": 0000 
    } 
} 

在编程层面,如何控制异常?
现在我已经制作了自定义异常类扩展Exception类。(不是 RuntimeException)
这种方法好还是不好?使用 RuntimeExcepion 会更好吗?
我的自定义异常类是...

public class APIException extends Exception {
    public enum Code {      
        // duplicated exceptions
        ALREADY_REGISTERED(1001),

        // size exceptions
        OVER_KEYWORD_LIMIT(2001),
        OVER_CATEGORY_LIMIT(2002),
        TOO_SHORT_CONTENTS_LENGTH(2003),
        TOO_SHORT_TITLE_LENGTH(2004),

        // database exceptions
        DB_ERROR(3001),

        // unregistered exceptions
        UNREGISTERED_NAME(4001),

        // missing information exceptions
        MISSING_PARAMETER(5001),

        // invalid information exceptions
        INVALID_PARAMETER(6001),
        INVALID_URL_PATTERN(6002);

        private final Integer value;
        private Code(Integer value) {
            this.value = value;
        }
        public Integer getType() {
            return value;
        }
    }

    private final Code code;

    public APIException(Code code) {
        this.code = code;
    }
    public APIException(Code code, Throwable cause) {
        super(cause);
        this.code = code;
    }
    public APIException(Code code, String msg, Throwable cause) {
        super(msg, cause);
        this.code = code;
    }
    public APIException(Code code, String msg) {
        super(msg);
        this.code = code;
    }

    public Code getCode() {
        return code;
    }
}

并使用这样的 APIException 类...

public void delete(int idx) throws APIException {
    try {
        Product product = productDao.findByIdx(idx);
        if (product.getCount() > 0) {
            throw new APIException(Code.ALREADY_REGISTERED,
                    "Already registered product.");
        }
        productDao.delete(idx);
    } catch (Exception e) {
        throw new APIException(Code.DB_ERROR,
                "Cannot delete product. " + e.getMessage());
    }
}

哪个更好地制作自定义异常类或使用存在的异常,如非法参数异常。
如果制作自定义异常类更好,我应该在 Exception 或 RuntimeException 之间扩展什么?
请向我推荐像我的情况这样的好例子。
提前致谢。

4

1 回答 1

3

由于您使用的是 Spring,我建议:

  1. 扩展 RuntimeException 并让异常传递到控制器

  2. 如果您的异常类对您要在错误 XML 中返回的属性进行建模,请对异常进行注释,以便它可以作为响应返回(包括@ResponseStatus如果它们都具有相同的状态代码)。

  3. 在您的控制器上实现一个或多个@ExceptionHandler方法,以返回异常@ResponseBody并确保 HttpServletResponse 正确。就像是:

    @ExceptionHandler
    @ResponseBody
    public ErrorResponse handleAPIException(APIException e, HttpServletResponse response) {
    // Set any response attributes you need...
        return e; // or some other response
    }
    
于 2012-07-18T06:46:00.477 回答