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());
    }
}

カスタム例外クラスを作成するのと、 illegalargumentexception のように存在する例外を使用するのとでは、どちらが良い
でしょうか。
私の状況のような良い例を教えてください。
前もって感謝します。

4

1 に答える 1

3

Springを使用しているので、次のことをお勧めします。

  1. RuntimeExceptionを拡張し、例外をコントローラーにドロップスルーさせる

  2. 例外クラスがエラーXMLで返したい属性をモデル化している場合は、例外に注釈を付けて、応答として返されるようにします(@ResponseStatusすべてが同じステータスコードである場合を含む)。

  3. 例外をとして返す1つ以上の@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 に答える