Java 異常分類及統一處理
一、異常分類
java異常分為”檢查”和”非檢查”兩類,”檢查”二字的意思是,程式碼編譯時,編譯器會去Check一下有沒有進行異常處理(捕獲或向上拋),對於歸類為需要檢查的異常,若沒處理,編譯就過不去。
初學的時候,常常想為啥異常要這樣分類處理? 後來明白了些,異常不過兩種:主觀和客觀,一個大多數情況下可以避免,一個大多數情況下無法避免。
像NullPointerException這類異常,大多跟程式設計師素質掛鉤(開發好,測試好, 基本不會在系統執行後蹦出來), 基本是可以避免的,java語法當初把它們對類為‘非檢查異常’,也算給程式設計師和編譯器省了不少事。
而像IOException這類跟外在環境有關的異常,幾乎是不可避免的(指不定哪一天那一秒網路就掛了),但是當不期而遇時,程式還是要有所作為,所以編譯器有必要督促一下程式設計師,Check一下,看看是是否對這些可能不期而至的異常進行了處理。當Exception物件傳遞到某個節點後,程式就可以執行一些措施了,比如:給使用者返回一個提示(”系統繁忙,請重試”),給監控平臺推送一個異常訊息等等。
二、異常的統一返回處理
1、容器處理
下面列舉Tomcat的處理方式,在web.xml下配置,按http返回碼或Exception型別來處理:
<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>
缺點:無法處理不需要返回html的請求,比如ajax;
2、框架處理
下面列舉Spring MVC的處理方式
- 使用Spring MVC自帶的簡單異常處理器SimpleMappingExceptionResolver
- 實現介面HandlerExceptionResolver 自定義異常處理器; (建議使用,可支援ajax等擴充套件)
- 使用@ExceptionHandler註解實現異常處理
第(1)種,在spring-mvc.xml下配置
<!-- 將Controller丟擲的異常轉到特定檢視 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- 不同異常分開跳轉-->
<!-- 可以自定義不同的異常-->
<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>
缺點:無法處理不需要返回html的請求
第(2)種,自定義HandlerExceptionResolver介面的實現類
/**
* 自定義異常處理器:支援ajax
* @author tangqing
*
*/
public class MyExceptionHandler implements HandlerExceptionResolver {
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
/* 區分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\":\"" + "系統異常" + "\"}"; // 自定義結構和前臺對接
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下注冊處理器
<bean id="exceptionHandler" class="com.test.MyExceptionHandler"/>
優點:可以處理ajax請求,也方便編碼實現功能擴充套件,比如異常的監控等。
第(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("沒錢!");
}
}
缺點:@ExceptionHandler的方法,必須和可能拋異常的方法在一同個Controller下。(不建議使用)
3、結合
實際專案中,在處理異常的統一返回時,會將一些自定義的異常或者擴充套件交給框架,將http返回碼的對映交給容器,因為http返回碼更外層,有些到不了框架,有些對於框架來說就不是一個異常(比如404之與Spring MVC)。框架是執行在容器裡的,當框架優先拿到異常並做了返回處理,容器就不會再進行對映。
相關推薦
Java 異常分類及統一處理(一)
一、異常分類 java異常分為”檢查”和”非檢查”兩類,”檢查”二字的意思是,程式碼編譯時,編譯器會去Check一下有沒有進行異常處理(捕獲或向上拋),對於歸類為需要檢查的異常,若沒處理,編譯就過不去。 初學的時候,常常想為啥異常要這樣分類處理? 後來明白了些,異常不過兩種:主觀和客觀,一個大多
Java 異常分類及統一處理
一、異常分類 java異常分為”檢查”和”非檢查”兩類,”檢查”二字的意思是,程式碼編譯時,編譯器會去Check一下有沒有進行異常處理(捕獲或向上拋),對於歸類為需要檢查的異常,若沒處理,編譯就過不去。 初學的時候,常常想為啥異常要這樣分類處理? 後來明白了
Java 異常分類及處理機制
1. 引子 try…catch…finally恐怕是大家再熟悉不過的語句了,而且感覺用起來也是很簡單,邏輯上似乎也是很容易理解。不過,我親自體驗的“教訓”告訴我,這個東西可不是想象中的那麼簡單、聽話。不信?那你看看下面的程式碼,“猜猜”它執行後的結果會是什麼?
Java學習筆記05--強制型別轉換 ;內部類(瞭解即可) ;Java異常體系及異常處理;iOS中的try catch 塊
===============java相關講解============= 強制型別轉換: 基本資料型別的轉換 小資料型別---->大的資料型別 自動型別轉換 大資料型別----->小資料型別 強制型別轉換
Java異常機制及異常處理建議
1、Java異常機制 異常指不期而至的各種狀況,如:檔案找不到、網路連線失敗、非法引數等。異常是一個事件,它發生在程式執行期間,干擾了正常的指令流程。Java通過API中Throwable類的眾多子
Java異常型別及處理
1.所有的異常都是從Throwable繼承而來的,是所有異常的共同祖先。 2.Throwable有兩個子類,Error和Exception。其中Error是錯誤,對於所有的編譯時期的錯誤以及系統錯誤都是通過Error丟擲的。這些錯誤表示故障發生於虛擬機器自身、或者發生在虛擬機器試圖執行
java執行中的異常資訊及收集處理方法
這個程式會報錯Exception in thread "main" java.lang.NumberFormatException: For input string: "小王" at java.base/java.lang.NumberFormatException.for
java 異常分類和處理機制
一、背景介紹 程式在執行過程中發生錯誤或異常情況是不可避免的,如果每一個執行時錯誤都由程式設計師手動控制和處理,其工作量是不可想象的。 Java語言中的異常處理機制就解決的上述問題,把錯誤與異常的管理帶到了面向物件的世界Java語言定義了很多異常類
小程序異常監控及錯誤處理
下載 數據監控 頁面加載 進一步 報錯 比較 路由 method 有一個 小程序異常監控收集 web端與小程序錯誤監控差異 在 Web 端監測的是頁面完整的 url,而小程序端監測的是路由地址; 小程序頁面屬於app內部的頁面,使用時已全部加載完畢,因此監控頁面性能時不統
Javaweb異常提示資訊統一處理
Java異常封裝(自己定義錯誤碼和描述,附原始碼) 2016年01月29日 22:30:54 小寶鴿 閱讀數:23262 標籤: java異常 更多 個人分類: Java基礎
Java異常知識整理_處理異常時的效能開銷
1.首先列兩個從別的地方看到的說法: try-catch程式碼段會產生額外的效能開銷,或者換個角度說,它往往會影響JVM對程式碼進行優化,所以建議僅捕獲有必要的程式碼段,儘量不要一個大的try包住整段的程式碼;與此同時,利用異常控制程式碼流程,也不是一個好主意,遠比我們通常意義上的條件語句(if/el
SpringMVC中的異常處理(全域性異常處理對自定義異常類進行統一處理)
前言: WEB開發中,總會有一些不可預料的錯誤,對於一些課預測的異常,我們可以自定義一個異常類,然後再載入個全域性異常處理器,對系統中出現的異常進行統一的處理。 注意:當你在Springmvc配置檔案中配置全域性異常處理器的時候,只要如下配置即可: <!
javaweb異常提示資訊統一處理(使用springmvc,附原始碼)
一、前言 後臺出現異常如何友好而又高效地回顯到前端呢?直接將一堆的錯誤資訊拋給使用者介面,顯然不合適。 先不考慮程式碼實現,我們希望是這樣的: (1)如果是頁面跳轉的請求,出現異常了,我們希望跳轉到一個異常顯示頁面,如下: 當然,這裡的介面不夠美觀,
Java 異常的捕獲與處理詳解(二)
上一篇Java 異常的捕獲與處理詳解(一)講了異常的產生、處理以及處理流程,接下來講其他內容。 一、throws關鍵字 thrwos關鍵字主要是在方法定義上使用的,表示的是此方法之中不進行異常的處理,而交給被呼叫處處理。 例如: class MyMath
Java異常分類(一)
Java 中的異常簡介 程式執行時,發生的不被期望的事件,它阻止了程式按照程式設計師的預期正常執行,這就是異常。 Java提供了更加優秀的解決辦法:異常處理機制。 Throwable類是Java異常型別的頂層父類,一個物件只有是 Throwable 類的(直接或者間接)
微信JSSDK接入Java版--步驟及問題處理和解決
本人活躍在開源中國 部落格地址https://my.oschina.net/xshuai/blog/726459 微信JSSDKJava版接入--步驟及問題處理和解決 可以關注測試微訊號,檢視效果 伺服器是個人的。請不要惡意攻擊。 JSSDK使用步驟 http://
java異常分類
Java中異常的分類 所有異常,都繼承自java.lang.Throwable類。 Throwable有兩個直接子類,Error類和Exception類。Exception Exception則可使從任何標準Java庫的類方法
Java 異常的捕獲與處理詳解(一)
一、異常的產生 異常是程式之中導致程式中斷的一種指令流,異常一旦出現並且沒有進行合理處理的話,那麼程式就將中斷執行。 下面,通過兩個程式來進行異常產生問題的對比。 (1)不產生異常的程式: public class Test { public s
java異常統一處理
出現 actor 錯誤 統一處理 type .get 。。 cfa getc 一般系統拋出的錯誤不含錯誤代碼,出去部分的404,500,400之外,我們如果想吧錯誤代碼定義的更細致,就需要自己繼承RuntimeExeption這個類後,重新定義構造方法定義自己的錯誤信息。
SpringBoot統一異常處理及統一回復介面
SpringBoot及Mybait壞境搭建詳見上一篇 一.定義回覆介面格式類 package com.example.demo.bean; /* * * Created by Ay on 2018/9/20 */ //返回的格式類 public class ResultBean&l