欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java異常分類及統(tǒng)一處理詳解

 更新時(shí)間:2016年03月28日 15:57:20   作者:邊號(hào)007  
這篇文章主要為大家詳細(xì)介紹了Java異常分類及統(tǒng)一處理,SpringMVC處理異常支持ajax,web.xml配置異常,感興趣的小伙伴們可以參考一下

一、異常分類

       java異常分為"檢查"和"非檢查"兩類,"檢查"二字的意思是,代碼編譯時(shí),編譯器會(huì)去Check一下有沒有進(jìn)行異常處理(捕獲或向上拋),對(duì)于歸類為需要檢查的異常,若沒處理,編譯就過(guò)不去。
       初學(xué)的時(shí)候,常常想為啥異常要這樣分類處理? 后來(lái)明白了些,異常不過(guò)兩種:主觀和客觀,一個(gè)大多數(shù)情況下可以避免,一個(gè)大多數(shù)情況下無(wú)法避免。
       像NullPointerException這類異常,大多跟程序員素質(zhì)掛鉤(開發(fā)好,測(cè)試好, 基本不會(huì)在系統(tǒng)運(yùn)行后蹦出來(lái)), 基本是可以避免的,java語(yǔ)法當(dāng)初把它們對(duì)類為‘非檢查異常',也算給程序員和編譯器省了不少事;
      而像IOException這類跟外在環(huán)境有關(guān)的異常,幾乎是不可避免的(指不定哪一天那一秒網(wǎng)絡(luò)就掛了),但是當(dāng)不期而遇時(shí),程序還是要有所作為,所以編譯器有必要督促一下程序員,Check一下,看看是是否對(duì)這些可能不期而至的異常進(jìn)行了處理。當(dāng)Exception對(duì)象傳遞到某個(gè)節(jié)點(diǎn)后,程序就可以執(zhí)行一些措施了,比如:給用戶返回一個(gè)提示("系統(tǒng)繁忙,請(qǐng)重試"),給監(jiān)控平臺(tái)推送一個(gè)異常消息等等。

二、異常的統(tǒng)一返回處理

1、容器處理

下面列舉Tomcat的處理方式,在web.xml下配置,按http返回碼或Exception類型來(lái)處理:

<error-page>
 <error-code>404</error-code>
 <location>/WEB-INF/views/error/404.jsp</location>
 </error-page>
 
 <error-page>
 <error-code>500</error-code>
 <location>/WEB-INF/views/error/500.jsp</location>
 </error-page> 
 
 <error-page>
 <exception-type>java.lang.Throwable</exception-type>
 <location>/WEB-INF/views/error/throwable.jsp</location>
 </error-page>

缺點(diǎn):無(wú)法處理不需要返回html的請(qǐng)求,比如ajax;

2、框架處理

下面列舉Spring MVC的處理方式

(1)使用Spring MVC自帶的簡(jiǎn)單異常處理器SimpleMappingExceptionResolver;
(2)實(shí)現(xiàn)接口HandlerExceptionResolver 自定義異常處理器; (建議使用,可支持ajax等擴(kuò)展)
(3)使用@ExceptionHandler注解實(shí)現(xiàn)異常處理;

第(1)種,在spring-mvc.xml下配置

 <!-- 將Controller拋出的異常轉(zhuǎn)到特定視圖 -->
 <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  <property name="exceptionMappings">
   <props>
    <!-- 不同異常分開跳轉(zhuǎn)--> 
    <!-- 可以自定義不同的異常-->    
    <prop key="com.test.MyException1">/error/e1</prop>
    <prop key="com.test.MyException2">/error/e2</prop>
    <!-- 如果不想自定義異常,只配置下面的即可--> 
    <prop key="java.lang.Throwable">/error/500</prop>
   </props>
  </property>
 </bean>

缺點(diǎn):無(wú)法處理不需要返回html的請(qǐng)求; 

 第(2)種,自定義HandlerExceptionResolver接口的實(shí)現(xiàn)類

/**
 * 自定義異常處理器:支持ajax
 * @author wangxu
 *
 */
public class MyExceptionHandler implements HandlerExceptionResolver {
 
 public ModelAndView resolveException(HttpServletRequest request,
 HttpServletResponse response, Object handler, Exception ex) {
 
 /* 區(qū)分ajax */
 boolean isAjax = request.getHeader("X-Requested-With") != null
 && "XMLHttpRequest".equals(request
  .getHeader("X-Requested-With").toString());
 if (!isAjax) {
 if (ex instanceof com.test.MyException1) {
 return new ModelAndView("/error/e1");
 } else if (ex instanceof com.test.MyException1) {
 return new ModelAndView("/error/e2");
 } else {
 return new ModelAndView("/error/500");
 }
 }
 String jsonRes = "{\"message\":\"" + "系統(tǒng)異常" + "\"}";// 自定義結(jié)構(gòu)和前臺(tái)對(duì)接
 PrintWriter out = null;
 try {
 out = response.getWriter();
 request.setCharacterEncoding("utf-8");
 response.setContentType("text/plain;charset=utf-8");
 out.print(jsonRes);
 out.flush();
 } catch (IOException e) {
 e.printStackTrace();
 } finally {
 out.close();
 }
 return null;
 }
}

并在spring-mvc.xml下注冊(cè)處理器

<bean id="exceptionHandler" class="com.test.MyExceptionHandler"/>
優(yōu)點(diǎn):可以處理ajax請(qǐng)求,也方便編碼實(shí)現(xiàn)功能擴(kuò)展,比如異常的監(jiān)控等。

第(3)種,@ExceptionHandler注解

@Controller
public class TestExceptionHandlerController {
 
 @ExceptionHandler({ MyException1.class })
 public String exception(MyException1 e) {
 return "/error/e1";
 }
 @RequestMapping("/marry")
 public void test() {
 throw new MyException1("沒錢!");
 }
}

缺點(diǎn):@ExceptionHandler的方法,必須和可能拋異常的方法在一同個(gè)Controller下。(不建議使用)

3、結(jié)合

實(shí)際項(xiàng)目中,在處理異常的統(tǒng)一返回時(shí),會(huì)將一些自定義的異?;蛘邤U(kuò)展交給框架,將http返回碼的映射交給容器,因?yàn)閔ttp返回碼更外層,有些到不了框架,有些對(duì)于框架來(lái)說(shuō)就不是一個(gè)異常(比如404之與Spring MVC)。框架是運(yùn)行在容器里的,當(dāng)框架優(yōu)先拿到異常并做了返回處理,容器就不會(huì)再進(jìn)行映射。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • Spring事務(wù)管理零基礎(chǔ)入門

    Spring事務(wù)管理零基礎(chǔ)入門

    事務(wù)的作用就是為了保證用戶的每一個(gè)操作都是可靠的,事務(wù)中的每一步操作都必須成功執(zhí)行,只要有發(fā)生異常就?回退到事務(wù)開始未進(jìn)行操作的狀態(tài)。事務(wù)管理是Spring框架中最為常用的功能之一,我們?cè)谑褂肧pring?Boot開發(fā)應(yīng)用時(shí),大部分情況下也都需要使用事務(wù)
    2022-10-10
  • Struts2實(shí)現(xiàn)文件上傳功能實(shí)例解析

    Struts2實(shí)現(xiàn)文件上傳功能實(shí)例解析

    這篇文章主要介紹了Struts2實(shí)現(xiàn)文件上傳功能實(shí)例解析,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-01-01
  • Nacos框架與原理之Nacos的參數(shù)

    Nacos框架與原理之Nacos的參數(shù)

    這篇文章主要介紹了Nacos框架與原理之Nacos的參數(shù),Nacos?中的參數(shù)有很多,如:命名空間、分組名、服務(wù)名、保護(hù)閾值、服務(wù)路由類型、臨時(shí)實(shí)例等,但下面文章我們要講解的是參數(shù),參數(shù)是什么呢,下面一起進(jìn)去文章學(xué)習(xí)詳細(xì)內(nèi)容吧
    2022-05-05
  • java線程池對(duì)象ThreadPoolExecutor的深入講解

    java線程池對(duì)象ThreadPoolExecutor的深入講解

    在我們的開發(fā)中“池”的概念并不罕見,有數(shù)據(jù)庫(kù)連接池、線程池、對(duì)象池、常量池等等。下面這篇文章主要給大家介紹了關(guān)于java線程池對(duì)象ThreadPoolExecutor的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧
    2018-09-09
  • Java中HashMap和Hashtable的區(qū)別淺析

    Java中HashMap和Hashtable的區(qū)別淺析

    這篇文章主要介紹了Java中HashMap和Hashtable的區(qū)別淺析,本文總結(jié)了6條它們之間的不同之處,需要的朋友可以參考下
    2015-03-03
  • springboot全局字符編碼設(shè)置方式(解決亂碼問(wèn)題)

    springboot全局字符編碼設(shè)置方式(解決亂碼問(wèn)題)

    這篇文章主要介紹了springboot全局字符編碼設(shè)置方式(解決亂碼問(wèn)題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java平閏年判斷的方法總結(jié)

    Java平閏年判斷的方法總結(jié)

    本篇文章給大家整理了Java平閏年判斷的兩種方法,大家在寫程序的時(shí)候如果用的到參考下吧。
    2018-02-02
  • spring?boot+vue實(shí)現(xiàn)JSAPI微信支付的完整步驟

    spring?boot+vue實(shí)現(xiàn)JSAPI微信支付的完整步驟

    JSAPI支付是用戶在微信中打開商戶的H5頁(yè)面,商戶在H5頁(yè)面通過(guò)調(diào)用微信支付提供的JSAPI接口調(diào)起微信支付模塊完成支付,下面這篇文章主要給大家介紹了關(guān)于spring?boot+vue實(shí)現(xiàn)JSAPI微信支付的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • 圖文詳解JAVA實(shí)現(xiàn)哈夫曼樹

    圖文詳解JAVA實(shí)現(xiàn)哈夫曼樹

    所謂哈夫曼樹就是要求最小加權(quán)路徑長(zhǎng)度,這是什么意思呢?簡(jiǎn)而言之,就是要所有的節(jié)點(diǎn)對(duì)應(yīng)的路徑長(zhǎng)度(高度-1)乘以該節(jié)點(diǎn)的權(quán)值,然后保證這些結(jié)果之和最小。下面這篇文章就給大家詳細(xì)介紹
    2016-08-08
  • SpringBoot整合Druid數(shù)據(jù)源的方法實(shí)現(xiàn)

    SpringBoot整合Druid數(shù)據(jù)源的方法實(shí)現(xiàn)

    Druid是阿里開發(fā)的一款開源的數(shù)據(jù)源,被很多人認(rèn)為是Java語(yǔ)言中最好的數(shù)據(jù)庫(kù)連接池,本文主要介紹了SpringBoot整合Druid數(shù)據(jù)源的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評(píng)論