1. 程式人生 > >Spring Boot 全域性異常

Spring Boot 全域性異常

兩種方案

一、使用@ControllerAdvice註解,Controller層的全域性異常統一處理

解釋註釋裡面有。

@ControllerAdvice 主要是用來Controller的一些公共的需求的低侵入性增強提供輔助,作用於@RequestMapping標註的方法上。

換句話說就是,這裡能夠捕獲到的異常,是由前端呼叫controller層@RequestMapping標註的方法內產生的。自己跑的定時程式的異常用這個方式catch不到!

@ExceptionHandler(value = Exception.class)

該註解是配合@ExceptionHandler一起使用的註解,自定義錯誤處理器,可自己組裝json字串,並返回到頁面。

value中指定該方法需要處理的那些異常類。

如果返回的是json,不是view,需要在方法上新增@ResponseBody

下圖程式碼,是對Exception和自定義的BizException進行不同的處理,寫得比較粗糙。正常情況下,出於安全考慮,Exception資訊只打印日誌,不暴露給前端。

package com.gs.base.util;

import common.request.spring.boot.autoconfigure.exception.BizException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;



/**
 * @program: gs_auth
 * @description: 全域性異常 ControllerAdvice方式
 * @author: liyijie
 * @create: 2018-10-18 17:07
 **/
@Order(value = -1)
@ControllerAdvice //主要是用來Controller的一些公共的需求的低侵入性增強提供輔助,作用於@RequestMapping標註的方法上。
public class GlobalExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 全域性異常捕捉處理
     * @param e
     * @return
     */
    //該註解是配合@ExceptionHandler一起使用的註解,自定義錯誤處理器,可自己組裝json字串,並返回到頁面。
    //value中指定該方法需要處理的那些異常類
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public MyResponse<Void> exceptionHandler(Exception e) {
        logger.error(e.getMessage(),e);
        return new MyResponse<>(MyResponse.CODE_FAIL,null,e.toString(),System.currentTimeMillis());
    }

    /**
     * 攔截捕捉自定義異常 BizException.class
     * @param e
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = BizException.class)
    public MyResponse<Void> BizExceptionHandler(BizException e) {
        return new MyResponse<>(MyResponse.CODE_FAIL,null,e.getMsg(),System.currentTimeMillis());
    }
}

二、實現ErrorController介面或者繼承AbstractErrorController抽象類或者繼承BasicErrorController類

等我心情好的時候把它補上