Spring Web MVC對(duì)異常處理有著完善的支持,我們可以捕獲控制器中拋出的任何異常,然后按照異常類(lèi)型將異常信息映射到某個(gè)視圖文件,向用戶(hù)顯示對(duì)應(yīng)的信息。
@ExceptionHandler
最簡(jiǎn)單的辦法就是使用@ExceptionHandler注解。它可以定義到一個(gè)控制器中,處理該控制器拋出的異常。@ExceptionHandler注解接受一個(gè)Class,指定捕獲哪個(gè)異常。如果不指定這個(gè)值,則捕獲方法參數(shù)列表中的所有異常。
@Controller
public class ExceptionController {
@ExceptionHandler(IOException.class)
public String handleException(IOException exception, Model model) {
model.addAttribute("message", exception.getMessage());
model.addAttribute("detail", exception);
return "exception";
}
@RequestMapping("/throw")
public String throwException() throws IOException {
if (true)
throw new IOException("蛋疼,遇到了一個(gè)IO錯(cuò)誤");
return "exception";
}
}
該注解標(biāo)注的方法也可以用于控制器通知(ControllerAdvice),應(yīng)用到多個(gè)控制器上。
異常解析器
另外一種異常處理辦法就是使用異常解析器。我們可以使用 SimpleMappingExceptionResolver將異常類(lèi)型和異常視圖關(guān)聯(lián)起來(lái)。也可以自己實(shí)現(xiàn)一個(gè)HandlerExceptionResolver用于處理異常。使用方法可以參考這篇博客Spring MVC 系統(tǒng)異常處理方式及性能對(duì)比。
Spring默認(rèn)情況下也會(huì)注冊(cè)一個(gè)異常解析器DefaultHandlerExceptionResolver,將Spring異常映射到4XX和5XX錯(cuò)誤,詳情參見(jiàn)Spring參考文檔 22.11.3. Handling Standard Spring MVC Exceptions
使用@ResponseStatus注解業(yè)務(wù)異常
我們的業(yè)務(wù)代碼的異??梢允褂聾ResponseStatus注解。當(dāng)這樣的異常拋出時(shí),ResponseStatusExceptionResolver會(huì)捕獲這些異常并設(shè)置相應(yīng)的錯(cuò)誤代碼。Spring默認(rèn)會(huì)注冊(cè)一個(gè)ResponseStatusExceptionResolver,我們不需要手動(dòng)設(shè)置即可使用。
@ResponseStatus(HttpStatus.NOT_FOUND)
public class MyCustomException extends RuntimeException {
public MyCustomException() {
super();
}
public MyCustomException(String msg) {
super(msg);
}
}
自定義Servlet容器錯(cuò)誤頁(yè)面
我們可以直接在web.xml中定義Servlet容器的錯(cuò)誤頁(yè)面。如果使用Servlet 3.0容器的話(huà),如果不指定錯(cuò)誤類(lèi)型,那么該頁(yè)面會(huì)作為默認(rèn)錯(cuò)誤頁(yè)面來(lái)應(yīng)用。在Spring Web MVC中,該頁(yè)面不僅可以是一個(gè)HTML或JSP頁(yè)面,也可以是控制器中某個(gè)處理方法接受的URL。
<error-page>
<location>/error</location>
</error-page>