Spring Web MVC框架(六) 異常處理

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>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,265評(píng)論 6 342
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,544評(píng)論 19 139
  • 本章主要內(nèi)容: 備用的Spring MVC配置項(xiàng) 處理文件上傳 控制器中的異常處理 使用flash屬性 “等等,客...
    hoxis閱讀 3,571評(píng)論 1 26
  • spring官方文檔:http://docs.spring.io/spring/docs/current/spri...
    牛馬風(fēng)情閱讀 1,853評(píng)論 0 3
  • 昨天說(shuō)好的沒(méi)有完成。所以早上起來(lái)就領(lǐng)了60個(gè)仰臥起坐的罰。昨天的一項(xiàng)都沒(méi)完成,罰的好像有點(diǎn)輕。所以晚上做了點(diǎn)別的運(yùn)...
    半醒日常閱讀 285評(píng)論 0 0

友情鏈接更多精彩內(nèi)容