SpringBoot例外処理()

ERROR:深刻な問題は、我々は処理できません。

例外:RuntimeExceptionをコンパイルチェックを外し、我々はコードを変更する必要があるという問題点があります

非のRuntimeException(CheckedExceptionなし例外クラス)は、プロセスをコンパイルする必要があり、そうでない場合はプログラムがコンパイルすることはできません

Excepitionのデフォルトの非RuntimeExcepition継承カスタム例外。

処理ファイル、ファイルパスエラー:これは、非例外のRuntimeException例で処理してもよいです。

無力のRuntimeException例:データベース要求のデータは、データベースには、このようなデータではありません。

それは十分ではありませんされているJavaに付属している唯一の例外を使用して、すぐにフロントエンドのエラー箇所を容易にするために、バックグラウンドの準備、で。あなたは、ハンドルの例外をカスタマイズする必要があります。

説明を容易にするために、この統一フォーマットエラー応答:

//统一错误响应
{
    code:10001
    message:xxxx
    request:GET url
}

UnifyResponse.class

@Getter
@Setter
@AllArgsConstructor
public class UnifyResponse {
    private int code;
    private String message;
    private String request;
    
}

この記事の障害は、2つのカテゴリに分類されます。

  • 不明な例外:フロントエンドの開発者とユーザーのためには無意味です。通常、サーバーサイドの開発者コードのロジックの問題。

    フロントエンドに戻って詳細な情報を必要とせず、ユーザーが統一内部サーバエラーを表示することができます

  • 既知の異常

知られている例外を定義します。

HttpException.class

public class HttpException extends RuntimeException {
    protected Integer code;
    protected Integer httpStatusCode = 500;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public Integer getHttpStatusCode() {
        return httpStatusCode;
    }

    public void setHttpStatusCode(Integer httpStatusCode) {
        this.httpStatusCode = httpStatusCode;
    }
}

NotFoundExcepiton.class

public class NotFoundException extends HttpException {
    public NotFoundException(int code){
        this.httpStatusCode = 404;
        this.code = code;
    }
}

例外処理:

GlobalExceptionAdvice.class:

@ControllerAdvice
public class GlobalExceptionAdvice {

    @Autowired
    private ExceptionCodeConfiguration exceptionCodeConfiguration;

    //未知异常   错误码就直接硬编码为9999
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    //如果不加这个注解,传回前端的http状态码会显示200 ok
    @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
    public UnifyResponse handleException(HttpServletRequest req, Exception e) {
        UnifyResponse message = new UnifyResponse(9999,"服务器异常",req.getMethod() + ' ' + req.getRequestURI());
        //未知异常方便调试,产品上线可以去掉
        System.out.println(e);
        return message;
    }

    //已知异常 Http异常其中包含多种异常  错误码由程序员传入例如: throw new NotFoundException(10001);
    //为什么不和上面未知异常一样使用@ResponseHandler  因为已知异常有很多种,状态码不一样,不能直接硬编码
    //解决办法:在处理各种已知异常的类中添加http状态码,在返回的response中自己添加。使用ResponseEntity
    @ExceptionHandler(HttpException.class)
    public ResponseEntity<UnifyResponse> handleHttpException(HttpServletRequest req, HttpException e) {
        UnifyResponse message = new UnifyResponse(e.getCode(),exceptionCodeConfiguration.getMessage(e.getCode()),req.getMethod() + ' ' + req.getRequestURI());
        HttpHeaders httpHeaders = new HttpHeaders();
        HttpStatus httpStatus = HttpStatus.resolve(e.getHttpStatusCode());
        ResponseEntity<UnifyResponse> r = new ResponseEntity<>(message,httpHeaders,httpStatus);
        return r;
    }
}

Configurationクラス

既知の異常なエラーコード情報と例外をベースにするために、優れた使用特性の設定クラスにハードコーディングされていません

exception-code.properties

liu.codes[0] = ok
liu.codes[999] = 服务器未知异常

liu.codes[10000] = 通用错误
liu.codes[10001] = 通用参数错误
liu.codes[10002] = 资源未找到
liu.codes[10003] = 没有找到合适的登陆处理方法
liu.codes[10004] = 令牌不合法或者过期
liu.codes[10005] = 用户未被授权
liu.codes[10006] = 登陆失败

liu.codes[20000] = 用户类通用错误
liu.codes[20001] = 用户已存在
liu.codes[20002] = 用户不存在
liu.codes[20003] = 用户密码错误
liu.codes[20004] = 获取用户wx openid失败

liu.codes[30000] = 商品类通用错误
liu.codes[30001] = 分类不存在
liu.codes[30002] = 商品信息不存
liu.codes[30003] = 主题不存在
liu.codes[30004] = complexity参数错误
liu.codes[30005] = Banner类资源不存在
liu.codes[30006] = 当前暂不支持级联获取sku-list
liu.codes[30007] = 当前暂不支持级联获取spu-list,请调用其他接口
liu.codes[30008] = 当前没有更多的商品信息了
liu.codes[30009] = Grid分类不存在
liu.codes[30010] = 请求的单品列表不存在
liu.codes[30011] = 请求的商品SaleExplain不存在

構成カテゴリを読み取ります。

ExceptionCodeConfiguration.class

@ConfigurationProperties(prefix = "liu")
@PropertySource(value = "classpath:/config/exception-code.properties")
@Component
public class ExceptionCodeConfiguration {

    private Map<Integer,String> codes =new HashMap<>();

    public Map<Integer, String> getCodes() {
        return codes;
    }

    public void setCodes(Map<Integer, String> codes) {
        this.codes = codes;
    }

    public String getMessage(int code){
        return codes.get(code);
    }
}

中国のプロパティを読んで文字化け解決

考え:

  • ファイル - >設定 - >ファイルのエンコードプロパティファイルのUTF-8エンコーディング、および透明ネイティブからASCIIチックに。
  • 後は上記の特性は、内容がそれを再入力、削除、すべての文字化けのファイルを操作することができます。

おすすめ

転載: www.cnblogs.com/chauncyL/p/12535971.html