異常處理類的介紹
類層次結(jié)構(gòu)

異常處理類詳解
1.????AnnotationMethodHandlerExceptionResolver
該類已經(jīng)被棄用了,所以不建議使用,所以就不介紹該類。
2.????HandlerExceptionResolver
它是Spring MVC異常處理的通用接口,所以異常處理類都要實現(xiàn)該接口,不過需要注意的是,它只能處理請求過程中拋出的異常,異常處理本身所拋出的異常和視圖解析過程中拋出的異常它是不能處理的。
3.????AbstractHandlerExceptionResolver
它是一個抽象類實現(xiàn)了HandlerExceptionResolver接口和Orderd接口,是HandlerExceptionResolver接口實現(xiàn)的基類,springMvc定義的異常處理類都繼承了該類。
4.AbstractHandlerMethodExceptionResolver和ExceptionHandlerExceptionResolver
這兩個類合力實現(xiàn)了對使用@ExceptionHandler注解的方法的解析,使被@ExceptionHandler標注的方法能處理異常,該注解只能作用于方法上。
5.????DefaultHandlerExceptionResolver
該異常類實現(xiàn)了對一些常見的web請問過程中的具體異常信息的處理,如NoSuchRequestHandlingMethodException等,具體可參考該類源碼。

6.????ResponseStatusExceptionResolver
該類用于解析帶有@ResponseStatus注解的異常類,該注解可以作用于類和方法,具體請看源碼了解。

7.????SimpleMappingExceptionResolver
通過配置的異常類和view的對應關(guān)系來解析異常,它的使用需要手動配置,需要在配置文件中顯示的聲明才能生效,默認是不生效的。

exceptionMappings:定義springmvc?要處理的異常類型和對應的錯誤頁面;
statusCodes:定義錯誤頁面和response?中要返回的錯誤狀態(tài)碼;
defaultErrorView:定義默認錯誤頁面,表示springmvc?處理不了的異常都跳轉(zhuǎn)到該頁面。
defaultStatusCode:定義response?默認返回的錯誤狀態(tài)碼,表示錯誤頁面未定義對應的錯誤狀態(tài)碼時返回該值;在這里表示跳轉(zhuǎn)到error、arrayOutView頁面的狀態(tài)碼為500。
8.????HandlerExceptionResolverComposite
HandlerExceptionResolverComposite是作為容器使用,可以封裝自定義的異常處理類,該類本身不會處理異常,而會調(diào)用自定義的異常處理類來處理異常,也需要顯示的配置,order表示異常類執(zhí)行的優(yōu)先級。

9.????注意點
1.1一個基于Spring MVC的Web應用程序中,可以存在多個實現(xiàn)了HandlerExceptionResolver的異常處理類,他們的執(zhí)行順序,由其order屬性決定, order值越小,越是優(yōu)先執(zhí)行,?在執(zhí)行到第一個返回不是null的ModelAndView的異常解析類時,不再執(zhí)行后續(xù)的尚未執(zhí)行的異常處理類的異常處理方法。
1.2在使用<mvc:annotation-driven/>標簽時,spingMvc會默認自動將ExceptionHandlerExceptionResolver, ResponseStatusExceptionResolver, DefaultHandlerExceptionResolver注入到Spring MVC的容器中,其中ExceptionHandlerExceptionResolver優(yōu)先級最高,ResponseStatusExceptionResolver第二,DefaultHandlerExceptionResolver第三。
1.3使用SimpleMappingExceptionResolver,需要手動將?SimpleMappingExceptionResolver配置到Spring MVC的配置文件,從而注入容器中使用;
1.4?ExceptionHandlerExceptionResolver不僅可以解析處理器類(controller)中標注了@ExceptionHandler注解的方法(這中方法只對單個controller是生效的,所以得寫多個),還可以在自定義異常處理類上使用@ControllerAdvice注解,在方法處理方法上使用?@ExceptionHandler注解,來對自定義的異常進行全局的異常處理;
注解的介紹
@ExceptionHandler
該注解只能作用于方法上,@ExceptionHandler?并且只對該注解所在的控制器(controller)有效,即只在當前controller中有效不能全局使用,可以通過繼承方式解決,也可以使用@ControllerAdvice注解完成全局處理。

該注解只能作用于方法上,并且value為一個Throwable的子類,在方法上使用該注解修飾后,給方法就能處理該注解定義的異常。

@ResponseStatus
默認情況下Spring MVC在處理Web請求時,如果發(fā)現(xiàn)存在沒有被應用代碼捕獲或者處理的異常信息,那么會返回狀態(tài)碼為500錯誤信息為Internal Server Error的提示信息。但是如果該異常是使用@ResponseStatus注解進行修飾過的,那么Spring MVC則會返回該注解上定義好的HTTP狀體碼及信息;該注解可以作用于類和方法。

該注解可以作用于方法和類上,該注解有兩個參數(shù),value表示HTTP的狀態(tài)碼,由于沒有默認值,使用時必須得自定義一個狀態(tài)碼,reason為返回錯去的原因,可以不指定;使用該注解后,用該注解修飾的類或方法就能在response中返回自定義的狀態(tài)碼。

@ControllerAdvice
該可以被應用于Springmvc容器中的所有的控制器類(controller)中,并且該注解只能作用于類及接口上,可以和@ExceptionHandler搭配使用進去全局的異常處理;

該注解只能作用于類或者接口,并且使用后能將我們自定義的異常處理類注入到SpringMvc的容器中,在自定義的異常處理類上可以加上它修飾,并且它可以和@ResponseStatus和@ExceptionHandler兩個注解搭配使用,從而完成對自定義異常的處理。
