使用@ExceptionHandler實現全域性異常處理器
阿新 • • 發佈:2019-02-04
使用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"/>
這樣就可以了,測試後無問題.附上其他程式碼:
log4j.properties:<!-- 檢視解析器 --> <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>
# 定義 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