最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中的@ExceptionHandler注解統(tǒng)一異常處理詳解

 更新時(shí)間:2024年01月31日 09:14:07   作者:你的小伙伴啊  
這篇文章主要介紹了Spring中的@ExceptionHandler注解統(tǒng)一異常處理詳解,當(dāng)我們使用這個(gè)@ExceptionHandler注解時(shí),定義一個(gè)異常的處理方法,加上@ExceptionHandler注解,這個(gè)方法就會(huì)處理類中其他方法拋出的異常,需要的朋友可以參考下

1,基本使用方法

Spring的@ExceptionHandler可以用來統(tǒng)一處理方法拋出的異常,比如這樣:

@ExceptionHandler()
public String handleExeption2(Exception ex) {
    System.out.println("拋異常了:" + ex);
    ex.printStackTrace();
    String resultStr = "異常:默認(rèn)";
    return resultStr;
}

當(dāng)我們使用這個(gè)@ExceptionHandler注解時(shí),我們需要定義一個(gè)異常的處理方法,比如上面的handleExeption2()方法,給這個(gè)方法加上@ExceptionHandler注解,這個(gè)方法就會(huì)處理類中其他方法(被@RequestMapping注解)拋出的異常。

2,注解的參數(shù)

@ExceptionHandler注解中可以添加參數(shù),參數(shù)是某個(gè)異常類的class,代表這個(gè)方法專門處理該類異常,比如這樣:

@ExceptionHandler(NumberFormatException.class)
public String handleExeption(Exception ex) {
    System.out.println("拋異常了:" + ex);
    ex.printStackTrace();
    String resultStr = "異常:NumberFormatException";
    return resultStr;
}

此時(shí)注解的參數(shù)是NumberFormatException.class,表示只有方法拋出NumberFormatException時(shí),才會(huì)調(diào)用該方法。

3,就近原則

當(dāng)異常發(fā)生時(shí),Spring會(huì)選擇最接近拋出異常的處理方法。

比如之前提到的NumberFormatException,這個(gè)異常有父類RuntimeException,RuntimeException還有父類Exception,如果我們分別定義異常處理方法,@ExceptionHandler分別使用這三個(gè)異常作為參數(shù),比如這樣:

@ExceptionHandler(NumberFormatException.class)
public String handleExeption(Exception ex) {
    System.out.println("拋異常了:" + ex);
    ex.printStackTrace();
    String resultStr = "異常:NumberFormatException";
    return resultStr;
}
 
@ExceptionHandler()
public String handleExeption2(Exception ex) {
    System.out.println("拋異常了:" + ex);
    ex.printStackTrace();
    String resultStr = "異常:默認(rèn)";
    return resultStr;
}
 
@ExceptionHandler(RuntimeException.class)
public String handleExeption3(Exception ex) {
    System.out.println("拋異常了:" + ex);
    ex.printStackTrace();
    String resultStr = "異常:RuntimeException";
    return resultStr;
}

那么,當(dāng)代碼拋出NumberFormatException時(shí),調(diào)用的方法將是注解參數(shù)NumberFormatException.class的方法,也就是handleExeption(),而當(dāng)代碼拋出IndexOutOfBoundsException時(shí),調(diào)用的方法將是注解參數(shù)RuntimeException的方法,也就是handleExeption3()。

4,注解方法的返回值

標(biāo)識(shí)了@ExceptionHandler注解的方法,返回值類型和標(biāo)識(shí)了@RequestMapping的方法是統(tǒng)一的,可參見@RequestMapping的說明,比如默認(rèn)返回Spring的ModelAndView對(duì)象,也可以返回String,這時(shí)的String是ModelAndView的路徑,而不是字符串本身。

有些情況下我們會(huì)給標(biāo)識(shí)了@RequestMapping的方法添加@ResponseBody,比如使用Ajax的場(chǎng)景,直接返回字符串,異常處理類也可以如此操作,添加@ResponseBody注解后,可以直接返回字符串,比如這樣:

@ExceptionHandler(NumberFormatException.class)
@ResponseBody
public String handleExeption(Exception ex) {
    System.out.println("拋異常了:" + ex);
    ex.printStackTrace();
    String resultStr = "異常:NumberFormatException";
    return resultStr;
}

這樣的操作可以在執(zhí)行完方法后直接返回字符串本身。

5,錯(cuò)誤的操作

使用@ExceptionHandler時(shí)盡量不要使用相同的注解參數(shù)。

如果我們定義兩個(gè)處理相同異常的處理方法:

@ExceptionHandler(NumberFormatException.class)
@ResponseBody
public String handleExeption(Exception ex) {
    System.out.println("拋異常了:" + ex);
    ex.printStackTrace();
    String resultStr = "異常:NumberFormatException";
    return resultStr;
}
 
@ExceptionHandler(NumberFormatException.class)
@ResponseBody
public String handleExeption2(Exception ex) {
    System.out.println("拋異常了:" + ex);
    ex.printStackTrace();
    String resultStr = "異常:默認(rèn)";
    return resultStr;
}

兩個(gè)方法都處理NumberFormatException,這種定義方式編譯可以通過,而當(dāng)NumberFormatException真正被拋出時(shí),Spring會(huì)給我們報(bào)錯(cuò):

java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped for [class java.lang.NumberFormatException]: {public java.lang.String TestController.handleExeption(java.lang.Exception), public java.lang.String TestController.handleExeption2(java.lang.Exception)}
at org.springframework.web.method.annotation.ExceptionHandlerMethodResolver.addExceptionMapping(ExceptionHandlerMethodResolver.java:102) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.web.method.annotation.ExceptionHandlerMethodResolver.<init>(ExceptionHandlerMethodResolver.java:66) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.getExceptionHandlerMethod(ExceptionHandlerExceptionResolver.java:458) ~[spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:378) ~[spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:61) ~[spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:140) ~[spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:78) ~[spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1255) ~[spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1062) ~[spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1008) ~[spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) ~[spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) ~[spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877) ~[spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) ~[javax.servlet-api-3.1.0.jar:3.1.0]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) ~[spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[javax.servlet-api-3.1.0.jar:3.1.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-embed-websocket-8.5.29.jar:8.5.29]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) [tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) [tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) [tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.29.jar:8.5.29]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_172]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_172]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.29.jar:8.5.29]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_172]

我在工作當(dāng)中的使用:

做統(tǒng)一異常處理,如下

1.在app-auth服務(wù)我拋出了一個(gè)一異常

2.該異常是在common下面定義的一個(gè)基礎(chǔ)異常

3.然后在common的另一個(gè)模塊中用這個(gè)方法來統(tǒng)一處理BaseException異常

AjaxResult 是一個(gè)通用的返回前端的對(duì)象,所以只要在需要的地方拋出這個(gè)基礎(chǔ)異常,就可以直接統(tǒng)一處理,返回需要的數(shù)據(jù)到前端。

到此這篇關(guān)于Spring中的@ExceptionHandler注解統(tǒng)一異常處理詳解的文章就介紹到這了,更多相關(guān)@ExceptionHandler注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中配置ContextLoaderListener方式

    Spring中配置ContextLoaderListener方式

    這篇文章主要介紹了Spring中配置ContextLoaderListener方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 淺談springboot的三種啟動(dòng)方式

    淺談springboot的三種啟動(dòng)方式

    這篇文章主要介紹了淺談springboot的三種啟動(dòng)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java如何讀取yaml配置文件

    java如何讀取yaml配置文件

    這篇文章主要介紹了java如何讀取yaml配置文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • spring整合kaptcha驗(yàn)證碼的實(shí)現(xiàn)

    spring整合kaptcha驗(yàn)證碼的實(shí)現(xiàn)

    這篇文章主要介紹了spring整合kaptcha驗(yàn)證碼的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • java中把漢字轉(zhuǎn)換成簡(jiǎn)拼的實(shí)現(xiàn)代碼

    java中把漢字轉(zhuǎn)換成簡(jiǎn)拼的實(shí)現(xiàn)代碼

    本篇文章是對(duì)在java中把漢字轉(zhuǎn)換成簡(jiǎn)拼的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • MyBatis中的JdbcType映射使用詳解

    MyBatis中的JdbcType映射使用詳解

    這篇文章主要介紹了MyBatis中的JdbcType映射使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 淺談SpringBoot中的@Conditional注解的使用

    淺談SpringBoot中的@Conditional注解的使用

    這篇文章主要介紹了淺談SpringBoot中的@Conditional注解的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-04-04
  • Nacos服務(wù)實(shí)例的權(quán)重設(shè)置方式(以及設(shè)置為0時(shí)的作用與場(chǎng)景)

    Nacos服務(wù)實(shí)例的權(quán)重設(shè)置方式(以及設(shè)置為0時(shí)的作用與場(chǎng)景)

    這篇文章主要介紹了Nacos服務(wù)實(shí)例的權(quán)重設(shè)置方式(以及設(shè)置為0時(shí)的作用與場(chǎng)景),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java中使用byte[]獲取16位字符串的技巧分享

    Java中使用byte[]獲取16位字符串的技巧分享

    在Java編程中,處理字符編碼和字節(jié)數(shù)組時(shí),尤其是從??byte[]???數(shù)組中獲取字符串,可能會(huì)遇到字符集的復(fù)雜性問題,本文將介紹如何從一個(gè)??byte[]??數(shù)組中正確獲取16位字符串,需要的朋友可以參考下
    2024-08-08
  • SpringMVC中解決@ResponseBody注解返回中文亂碼問題

    SpringMVC中解決@ResponseBody注解返回中文亂碼問題

    這篇文章主要介紹了SpringMVC中解決@ResponseBody注解返回中文亂碼問題, 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04

最新評(píng)論

仲巴县| 泽州县| 玉田县| 黎平县| 万全县| 中方县| 安仁县| 泸定县| 崇仁县| 石首市| 武宣县| 安图县| 通江县| 洛隆县| 永清县| 印江| 武邑县| 惠来县| 木兰县| 城步| 陆丰市| 黑龙江省| 石家庄市| 佳木斯市| 托克逊县| 女性| 江孜县| 黔西| 新竹市| 永宁县| 北辰区| 大姚县| 珲春市| 河间市| 澳门| 桂林市| 巫溪县| 南安市| 宜川县| 汉阴县| 治多县|