Spring全局異常捕獲不生效問題的解決辦法
問題場(chǎng)景:
Spring項(xiàng)目全局異常處理不生效,登錄接口報(bào)錯(cuò)異常信息被直接返回到接口響應(yīng)中。
問題描述
同事反饋說系統(tǒng)登錄報(bào)錯(cuò),查看接口響應(yīng),堆棧信息直接返回前臺(tái)了,Debug代碼發(fā)現(xiàn)全局異常捕獲也沒有生效。

原因分析:
先梳理一下Spring全局異常攔截的邏輯:
一,Spring在org.springframework.web.servlet.DispatcherServlet#doDispatch內(nèi)部方法調(diào)用加了try catch機(jī)制,攔截所有Exception異常。

二,DispatcherServlet#processDispatchResult方法內(nèi)部再次調(diào)用了processHandlerException方法。

三,processHandlerException 方法負(fù)責(zé)在 Spring MVC 中協(xié)調(diào)處理處理器執(zhí)行過程中發(fā)生的異常。它首先清理響應(yīng)狀態(tài),然后嘗試通過一系列注冊(cè)的 HandlerExceptionResolver 找到合適的異常處理策略,并最終返回一個(gè)用于渲染錯(cuò)誤頁面的 ModelAndView 對(duì)象,或者在未能妥善處理異常時(shí)重新拋出異常。

解決方案:
先確定異常類型,再檢查異常拋出位置。
- BadSqlGrammarException異常的祖先類繼承了Exception,所以DispatcherServlet#doDispatch方法肯定是可以捕獲該異常的,所以出現(xiàn)問題的原因就在于該異常可能未經(jīng)過doDispatch方法。
- 檢查代碼報(bào)錯(cuò)邏輯是在org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter方法中。
- Sevlet容器定義的組件執(zhí)行順序有filter -> servlet -> interceptor -> Controller。
- 所以在filter層拋出的異常,理論上只能在filter層解決,最簡(jiǎn)單的方式就是定義一個(gè)order靠前的ExceptionFilter來捕獲后續(xù)filter異常。另外也可以基于Tomcat容器來配置全局異常消除:
- 在server.xml中添加一個(gè)ErrorReportValve,將showReport設(shè)置為false就隱藏了詳細(xì)報(bào)錯(cuò)信息,showServerInfo設(shè)置為false是隱藏Tomcat版本信息。
\<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />
以上就是Spring全局異常捕獲不生效問題的解決辦法的詳細(xì)內(nèi)容,更多關(guān)于Spring全局異常捕獲不生效的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Springboot如何統(tǒng)一處理Filter異常
這篇文章主要介紹了Springboot如何統(tǒng)一處理Filter異常問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
關(guān)于Cannot?resolve?com.microsoft.sqlserver:sqljdbc4:4.0報(bào)錯(cuò)問題解
這篇文章主要給大家介紹了關(guān)于Cannot?resolve?com.microsoft.sqlserver:sqljdbc4:4.0報(bào)錯(cuò)問題的解決辦法,這個(gè)是在pom文件中添加依賴出現(xiàn)報(bào)錯(cuò)問題,需要的朋友可以參考下2024-02-02
Netty源碼分析NioEventLoop線程的啟動(dòng)
這篇文章主要為大家介紹了Netty源碼分析NioEventLoop線程的啟動(dòng)示例,有需要的朋友,可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
springboot項(xiàng)目Redis統(tǒng)計(jì)在線用戶的實(shí)現(xiàn)示例
最近做個(gè)項(xiàng)目需要統(tǒng)計(jì)在線用戶,本文主要介紹了springboot項(xiàng)目Redis統(tǒng)計(jì)在線用戶的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
使用springboot跳轉(zhuǎn)到指定頁面和(重定向,請(qǐng)求轉(zhuǎn)發(fā)的實(shí)例)
這篇文章主要介紹了使用springboot跳轉(zhuǎn)到指定頁面和(重定向,請(qǐng)求轉(zhuǎn)發(fā)的實(shí)例),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java數(shù)組使用binarySearch()方法查找指定元素的實(shí)現(xiàn)
這篇文章主要介紹了Java數(shù)組使用binarySearch()方法查找指定元素的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
java中synchronized Lock(本地同步)鎖的8種情況
本文主要介紹了java中synchronized Lock(本地同步)鎖的8種情況,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
IDEA版使用Java操作Redis數(shù)據(jù)庫的方法
這篇文章主要介紹了IDEA版使用Java操作Redis數(shù)據(jù)庫的方法,首先需要下載jedis.jar包,然后再工程中設(shè)置具體操作步驟跟隨小編一起學(xué)習(xí)下吧2021-08-08

