1. 程式人生 > >使用@ExceptionHandler實現全域性異常處理器

使用@ExceptionHandler實現全域性異常處理器

使用SpringMVC提供的@ControllerAdvice,@ExceptionHandler可以方便的實現全域性異常處理器.

不僅方便,可以更細粒度的控制各種異常.

首先建立一個全域性異常處理類:

/**
 * Created with IntelliJ IDEA.
 *
 * @author: ChuRuo Xu
 * 註解全域性異常處理器
 */
@ControllerAdvice
public class AnnotationExceptionHandler {

    // 自定義異常
    @ExceptionHandler(CustomException.class)
    public ModelAndView customerExceptionHandler(CustomException customerException) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg", customerException.getMessage());
        modelAndView.setViewName("error");
        return modelAndView;
    }

    // 系統異常
    @ExceptionHandler(Exception.class)
    public ModelAndView Exception(Exception e) {
        //獲取日誌記錄器,這個記錄器將負責控制日誌資訊
        Logger logger = Logger.getLogger(AnnotationExceptionHandler.class.getName());
        //使用Logger物件的debug、info方法輸出日誌資訊
        logger.info(e.getMessage());
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg", "伺服器異常!請稍後再試!");
        modelAndView.setViewName("error");
        return modelAndView;
    }

}

自定義異常類繼承RuntimeException重寫方法即可,idea使用ctrl+o

之所以繼承RuntimeException,忘記了....哈哈,大概是對於Spring來說比繼承exception更好

/**
 * Created with IntelliJ IDEA.
 *
 * @author: ChuRuo Xu
 * 自定義異常處理器
 */
public class CustomException extends RuntimeException {

    public CustomException() {
        super();
    }

    public CustomException(String message) {
        super(message);
    }

    public CustomException(String message, Throwable cause) {
        super(message, cause);
    }

    public CustomException(Throwable cause) {
        super(cause);
    }

    protected CustomException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }

}

最重要的一步,在springmvc.xml配置檔案中掃描註解包
<!-- 掃描controller註解,多個包使用[,]分割 -->
    <context:component-scan base-package="com.springmvc.exception"/>

這樣就可以了,測試後無問題.附上其他程式碼:
<!-- 檢視解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"
                  value="org.springframework.web.servlet.view.JstlView"/>
        <!-- 字首 -->
        <property name="prefix" value="/jsp/"/>
        <!-- 字尾 -->
        <property name="suffix" value=".jsp"/>
    </bean>
log4j.properties:
# 定義 DEBUG 優先順序, R 為日誌輸出目的的
log4j.rootLogger= DEBUG, R

# 設定日誌輸出型別 , 為檔案型別
log4j.appender.R= org.apache.log4j.FileAppender

# 設定日誌檔案的位置
log4j.appender.R.file=F:\\logRecord.log

# 每次在檔案尾寫入新的日誌資訊
log4j.appender.R.Append= true 

# 日誌輸出資訊格式型別
log4j.appender.R.layout= org.apache.log4j.PatternLayout

# 日誌輸出資訊格式為 換行、日期、優先順序、 [ 全類名 ] 、日誌資訊、換行
log4j.appender.R.layout.ConversionPattern= %n%d%p [%l] %m%n