首頁 Java java教程 springMVC對異常處理的支持

springMVC對異常處理的支持

Jun 26, 2017 am 09:21 AM
spring springmvc 處理 例外 支援

無論做什麼項目,進行異常處理都是非常有必要的,而且你不能把一些只有程式設計師才能看懂的錯誤代碼拋給用戶去看,所以這時候進行統一的異常處理,展現一個比較友善的錯誤頁面就顯得很有必要了。跟其他MVC框架一樣,springMVC也有自己的異常處理機制。
springMVC提供的例外處理主要有兩種方式,一種是直接實作自己的HandlerExceptionResolver,當然這也包括使用Spring已經為我們提供好的SimpleMappingExceptionResolver和DefaultHandlerExceptionResolver,另一種是使用註解的方式實作一個專門用於處理異常的Controller——ExceptionHandler。

 

 

1、實作自己的HandlerExceptionResolver,HandlerExceptionResolver是一個接口,springMVC本身已經對其有了一個自身的實作-DefaultHandlerExceptionResolver,該解析器只是對其中的一些比較典型的異常進行了攔截,然後返回對應的錯誤碼,當然你也可以繼承DefaultHandlerExceptionResolver類,然後重寫其中的一些異常處理方法來實現自己的異常處理。

import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
import org.springframework.web.servlet.HandlerExceptionResolver;  
import org.springframework.web.servlet.ModelAndView;  
  
public class ExceptionHandler implements HandlerExceptionResolver {  
  
    @Override  public ModelAndView resolveException(HttpServletRequest request,  
            HttpServletResponse response, Object handler, Exception ex) {  // TODO Auto-generated method stub  return new ModelAndView("exception");  
    }  
  
}
登入後複製

 

 上述的resolveException的第4個參數表示對哪種類型的異常進行處理。因為Exception類別是所有異常類別的基底類,所以如果想根據異常類型的不同來進行不同的處理的話,可以在resolveException方法裡面根據不同的異常類型進行不同的處理,返回不同的異常視圖。如:

public class ExceptionHandler implements HandlerExceptionResolver {  
  
    @Override  public ModelAndView resolveException(HttpServletRequest request,  
            HttpServletResponse response, Object handler, Exception ex) {  // TODO Auto-generated method stub  if (ex instanceof NumberFormatException) {  //doSomething...  return new ModelAndView("number");  
        } else if (ex instanceof NullPointerException) {  //doSomething...  return new ModelAndView("null");  
        }  return new ModelAndView("exception");  
    }  
  
}
登入後複製

 

定義了這樣一個異常處理器之後就要在applicationContext中定義這樣一個bean對象,如:

#bean id="exceptionResolver" class="com.tiantian.xxx.web.handler.ExceptionHandler"/> ;  

Spring除了實作了一個DefaultHandlerExceptionResolver之外,還實作了一個SimpleMappingExceptionResolver,這兩者都是繼承自抽象類別AbstractHandlerExceptionResolver,而AbstractHandlerExceptionResolver是實現了HandlerExceptionResolver介面的resolveException方法的,並由此抽取出兩個抽象方法,一個是在進行異常處理之前執行的方法prepareResponse(exception, response),一個方法prepareResponse(exception, response),一個方法是進行異常解析的doResolveException(request, response, handler, exception)方法。 SimpleMappingExceptionResolver,顧名思義就是透過簡單的映射關係來決定由哪個視圖來處理目前的錯誤訊息。 SimpleMappingExceptionResolver提供了透過異常類型exceptionMappings來進行異常與視圖之間的映射關係,提供了在發生異常時透過statusCodes來映射異常傳回的視圖名稱和對應的HttpServletResponse的回傳碼。而且可以透過defaultErrorView和defaultErrorCode來指定預設值,defaultErrorView表示當沒有在exceptionMappings裡面找到對應的例外類型時就回傳defaultErrorView定義的視圖,defaultErrorCode表示在發生例外狀況時沒有在視圖與回傳碼的對映關係statusCodesCodesCodesCodesCodesCodesCosCodesCo 中找到對應的映射時預設回傳的回傳碼。在使用SimpleMappingExceptionResolver時,當發生異常的時候,SimpleMappingExceptionResolver將會把目前的例外物件放到自身屬性exceptionAttribute中,當沒有指定exceptionAttribute時,exceptionAttribute就是用預設值exception。

 

以下是一個簡單的例子:

 

(1)SpringMVC的servlet設定檔中申明一個SimpleMappingExceptionResolver bean,並且透過設定屬性exceptionMappings和defaultExceptionView來指定異常和視圖的對應關係

Xml代码
登入後複製
<bean>  
    <property>  
        <props>  
            <prop>number</prop><!-- 表示当抛出NumberFormatException的时候就返回名叫number的视图 -->  
            <prop>null</prop>  
        </props>  
    </property>  
    <property></property><!-- 表示当抛出异常但没有在exceptionMappings里面找到对应的异常时 返回名叫exception的视图-->  
    <property><!-- 定义在发生异常时视图跟返回码的对应关系 -->  
        <props>  
            <prop>500</prop><!-- 表示在发生NumberFormatException时返回视图number,然后这里定义发生异常时视图number对应的HttpServletResponse的返回码是500 -->  
            <prop>503</prop>  
        </props>  
    </property>  
    <property></property><!-- 表示在发生异常时默认的HttpServletResponse的返回码是多少,默认是200 -->  
</bean>
登入後複製

(2 )如下存取:

@Controller  
@RequestMapping("/test")  
public class TestController {  
  
    @RequestMapping("/null")  public void testNullPointerException() {  
        Blog blog = null;  //这里就会发生空指针异常,然后就会返回定义在SpringMVC配置文件中的null视图          System.out.println(blog.getId());  
    }  
      
    @RequestMapping("/number")  public void testNumberFormatException() {  //这里就会发生NumberFormatException,然后就会返回定义在SpringMVC配置文件中的number视图  Integer.parseInt("abc");  
    }  
      
    @RequestMapping("/default")  public void testDefaultException() {  if (1==1)  //由于该异常类型在SpringMVC的配置文件中没有指定,所以就会返回默认的exception视图  throw new RuntimeException("Error!");  
    }  
      
}
登入後複製

 

## 

(3) Jsp頁面中可以存取到的例外對象,這裡以NumberFormatException的返回視圖number.jsp作為範例:

Jsp程式碼  
springMVC對異常處理的支持
#
  
  
  
nbsp;HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  
    
    <base>">  
      
    <title>My JSP 'number.jsp' starting page</title>  
      
    <meta>  
    <meta>  
    <meta>      
    <meta>  
    <meta>  
    <!--  
    <link rel="stylesheet" type="text/css" href="styles.css?1.1.11">  
    -->  
  
    
    
    
    NumberFormatException. <br>  
    <br>  
    <br><span><!-- 这是JSP中的内置对象exception --></span>  
  
  
  
    <br><span><!-- 这是SpringMVC放在返回的Model中的异常对象 --></span>  
  
  
  
    <span><!-- HttpServletResponse返回的错误码信息,因为前面已经配置了NumberFormatException的错误码返回值为888,所以这里应该显示888 --></span>  
  
  
  
    
登入後複製
 

(4)当请求/test/number.do的时候会返回定义好的number视图,返回结果如下:


 

2、使用@ExceptionHandler进行处理

 

使用@ExceptionHandler进行处理有一个不好的地方是进行异常处理的方法必须与出错的方法在同一个Controller里面

 

如:

Java代码  springMVC對異常處理的支持
 
import org.springframework.stereotype.Controller;  
import org.springframework.web.bind.annotation.ExceptionHandler;  
import org.springframework.web.bind.annotation.RequestMapping;  
  
import com.tiantian.blog.web.servlet.MyException;  
  
@Controller  
public class GlobalController {  
  
      /** 
     * 用于处理异常的 
     * @return 
     */  
    @ExceptionHandler({MyException.class})  public String exception(MyException e) {  
        System.out.println(e.getMessage());  
        e.printStackTrace();  return "exception";  
    }  
      
    @RequestMapping("test")  public void test() {  throw new MyException("出错了!");  
    }  
      
      
}
登入後複製

 

这里在页面上访问test方法的时候就会报错,而拥有该test方法的Controller又拥有一个处理该异常的方法,这个时候处理异常的方法就会被调用

 

 

优先级

既然在SpringMVC中有两种处理异常的方式,那么就存在一个优先级的问题:

 

当发生异常的时候,SpringMVC会如下处理:

(1)SpringMVC会先从配置文件找异常解析器HandlerExceptionResolver

(2)如果找到了异常异常解析器,那么接下来就会判断该异常解析器能否处理当前发生的异常

(3)如果可以处理的话,那么就进行处理,然后给前台返回对应的异常视图

(4)如果没有找到对应的异常解析器或者是找到的异常解析器不能处理当前的异常的时候,就看当前的Controller中有没有提供对应的异常处理器,如果提供了就由Controller自己进行处理并返回对应的视图

(5)如果配置文件里面没有定义对应的异常解析器,而当前Controller中也没有定义的话,那么该异常就会被抛出来。

以上是springMVC對異常處理的支持的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

WIN10服務主機太佔cpu的處理操作過程 WIN10服務主機太佔cpu的處理操作過程 Mar 27, 2024 pm 02:41 PM

1.首先我們右鍵點選任務列空白處,選擇【任務管理器】選項,或右鍵開始徽標,然後再選擇【任務管理器】選項。 2.在開啟的任務管理器介面,我們點選最右邊的【服務】選項卡。 3.在開啟的【服務】選項卡,點選下方的【開啟服務】選項。 4.在開啟的【服務】窗口,右鍵點選【InternetConnectionSharing(ICS)】服務,然後選擇【屬性】選項。 5.在開啟的屬性窗口,將【開啟方式】修改為【禁用】,點選【應用程式】後點選【確定】。 6.點選開始徽標,然後點選關機按鈕,選擇【重啟】,完成電腦重啟就行了。

利用Spring Boot以及Spring AI建構生成式人工智慧應用 利用Spring Boot以及Spring AI建構生成式人工智慧應用 Apr 28, 2024 am 11:46 AM

Spring+AI作為行業領導者,透過其強大、靈活的API和先進的功能,為各種行業提供了領先性的解決方案。在本專題中,我們將深入探討Spring+AI在各領域的應用範例,每個案例都將展示Spring+AI如何滿足特定需求,實現目標,並將這些LESSONSLEARNED擴展到更廣泛的應用。希望這個專題能對你有所啟發,更深入地理解和利用Spring+AI的無限可能。 Spring框架在軟體開發領域已經有超過20年的歷史,自SpringBoot1.0版本發布以來已有10年。現在,無人會質疑,Spring

浪人崛起水池的異常任務攻略 浪人崛起水池的異常任務攻略 Mar 26, 2024 pm 08:06 PM

水池的異常是遊戲中一個支線任務,很多玩家想知道水池的異常任務怎麼完成,其實非常簡單,首先我們要掌握在水中拍攝的技術,才可以接取任務,調查惡臭味的來源,之後發現原來是水池底下有很多的屍體,具體內容一起來看看這篇浪人崛起水池的異常任務圖文攻略。浪人崛起水池的異常任務攻略1、和飯塚對話,學習在水中拍攝的技術。 2、前往下圖位置接取水池的異常任務。 3.來到任務地點和NPC對話,了解到附近的水池有一股惡臭味。 4、前往水池調查。 5.大概游到下圖位置,潛入到水下,會發現很多的屍體。 6.使用相機對屍體進行拍攝。 7

MIT最新力作:以GPT-3.5解決時間序列異常檢測問題 MIT最新力作:以GPT-3.5解決時間序列異常檢測問題 Jun 08, 2024 pm 06:09 PM

今天要為大家介紹一篇MIT上週發表的文章,使用GPT-3.5-turbo解決時間序列異常檢測問題,初步驗證了LLM在時間序列異常檢測的有效性。整個過程沒有進行finetune,直接使用GPT-3.5-turbo進行異常檢測,文中的核心是如何將時間序列轉換成GPT-3.5-turbo可辨識的輸入,以及如何設計prompt或pipeline讓LLM解決異常檢測任務。下面跟大家詳細介紹一下這篇工作。圖片論文標題:Largelanguagemodelscanbezero-shotanomalydete

學習PHP中如何處理特殊字元轉換單引號 學習PHP中如何處理特殊字元轉換單引號 Mar 27, 2024 pm 12:39 PM

在PHP開發過程中,處理特殊字元是常見的問題,尤其是在字串處理中經常會遇到特殊字元轉義的情況。其中,將特殊字元轉換單引號是比較常見的需求,因為在PHP中,單引號是一種常用的字串包裹方式。在本文中,我們將介紹如何在PHP中處理特殊字元轉換單引號,並提供具體的程式碼範例。在PHP中,特殊字元包括但不限於單引號(')、雙引號(")、反斜線()等。在字串

C++ 函式異常與單測:確保程式碼健全性 C++ 函式異常與單測:確保程式碼健全性 May 03, 2024 am 09:18 AM

異常處理和單測是確保C++程式碼健全性的重要實務。異常透過try-catch區塊處理,當程式碼引發異常時會跳到catch區塊。單元測試可隔離程式碼測試,以驗證異常處理在不同情況下是否如預期運作。實戰案例:sumArray函數計算數組元素總和,並拋出異常以處理空輸入數組。單元測試可驗證函數在異常情況下的預期行為,如當數組為空時拋出std::invalid_argument異常。結論:透過利用異常處理和單測,我們可以處理異常情況、防止程式碼崩潰,並確保程式碼在異常情況下按預期運行。

C++ 函式異常進階:客製化錯誤處理 C++ 函式異常進階:客製化錯誤處理 May 01, 2024 pm 06:39 PM

C++中的異常處理可透過自訂異常類別增強,提供特定錯誤訊息、上下文資訊以及根據錯誤類型執行自訂操作。定義繼承自std::exception的異常類,提供特定的錯誤訊息。使用throw關鍵字拋出自訂異常。在try-catch區塊中使用dynamic_cast將捕獲到的異常轉換為自訂異常類型。在實戰案例中,open_file函數會拋出FileNotFoundException異常,捕捉並處理該異常可提供更具體的錯誤訊息。

JUnit單元測試框架在Spring專案中的應用 JUnit單元測試框架在Spring專案中的應用 Apr 18, 2024 pm 04:54 PM

JUnit是Spring專案中廣泛使用的Java單元測試框架,可透過以下步驟應用:新增JUnit依賴項:org.junit.jupiterjunit-jupiter5.8.1test編寫測試案例:使用@ExtendWith(SpringExtension.class)啟用擴展,使用@Autowired注入Bean,使用@BeforeEach和@AfterEach準備和清理,用@Test標記測試方法。

See all articles