sPRingmvc處理異常有三種方式: 1.在一個controller中定義一個方法,用@ExceptionHandler注解標(biāo)注。(優(yōu)先級最高)
@ExceptionHandler
public
ModelAndView handleException(Exception exception){
ModelAndView mv =
new
ModelAndView(
"error/500"
);
mv.addObject(
"ex"
,exception);
return
mv;
}
@ExceptionHandler
public
String handleException(Exception exception){
return
"error/500"
;
}
2.全局異常設(shè)置(下載地址 優(yōu)先級次之)
<!-- 將Controller拋出的異常轉(zhuǎn)到特定View,異常映射處理器 -->
<bean
class
=
"org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"
>
<!-- 定義異常處理頁面用來獲取異常信息的變量名,默認(rèn)名為exception -->
<!--<property name=
"exceptionAttribute"
value=
"ex"
></property>-->
<property name=
"exceptionMappings"
>
<props>
</props>
</property>
</bean>
3.自定義異常處理(下載地址 優(yōu)先級次之)
public
ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println(
"自定義異常處理器"
);
logger = LoggerFactory.getLogger(ex.getClass());
ResponseStatus responseStatus = AnnotationUtils.getAnnotation(ex.getClass(), ResponseStatus.
class
);
ModelAndView modelAndView =
new
ModelAndView(
"error/500"
);
//自定義的異常
if
(responseStatus !=
null
) {
modelAndView.setViewName(
"error/"
+ responseStatus.value().value());
}
else
{
//其他異常,做一些其他的處理,如發(fā)送錯誤報警郵件,記錄日志
logger.error(ex.getMessage(), ex);
}
return
modelAndView;
}
4.自定義一個異常類,繼承RunTimeException(優(yōu)先級最低)
@ResponseStatus
(value = HttpStatus.NOT_FOUND,reason =
"No such resource"
)
public
class
NotFoundException
extends
RuntimeException {
}
當(dāng)拋出我們自定義的異常時,就會構(gòu)造出相應(yīng)的狀態(tài)碼,一般我們還是設(shè)置SimpleMappingExceptionResolver,來進(jìn)行統(tǒng)一跳轉(zhuǎn)到錯誤頁面。
最佳實踐:還是用全局的SimpleMappingExceptionResolver最好,在jsp里面寫日志,當(dāng)需要進(jìn)行細(xì)粒度的控制時,還是自定義異常解析器為好,其他的自我感覺不好用!如有不正確的,歡迎指正! ?
新聞熱點
疑難解答