Javaweb異常提示信息統一處理

Java異常封裝(本身定義錯誤碼和描述,附源碼)

版權聲明:本文爲博主原創文章,轉載註明出處 https://blog.csdn.net/u013142781/article/details/50609488

真正工做了才發現,Java裏面的異常在真正工做中使用仍是十分廣泛的。何時該拋出什麼異常,這個是必須知道的。javascript

固然真正工做裏面主動拋出的異常都是通過分裝過的,本身能夠定義錯誤碼和異常描述。html

下面小寶鴿就爲你們介紹一個Java異常簡單封裝的例子。前端

在給出異常分裝例子以前,須要給你們普及Java裏面的checked異常和unchecked異常的個概念。java

1、checked異常和unchecked異常

這裏之因此讓你們清楚checked異常和unchecked異常概念,是由於:待會咱們的異常是繼承unchecked異常RuntimeException的。瞭解一下並沒有壞處嘛web

checked異常:ajax

表示無效,不是程序中能夠預測的。好比無效的用戶輸入,文件不存在,網絡或者數據庫連接錯誤。這些都是外在的緣由,都不是程序內部能夠控制的。spring

必須在代碼中顯式地處理。好比try-catch塊處理,或者給所在的方法加上throws說明,將異常拋到調用棧的上一層。數據庫

繼承自java.lang.Exception(java.lang.RuntimeException除外)。json

unchecked異常:安全

表示錯誤,程序的邏輯錯誤。是RuntimeException的子類,好比IllegalArgumentException, NullPointerException和IllegalStateException。

不須要在代碼中顯式地捕獲unchecked異常作處理。

繼承自java.lang.RuntimeException(而java.lang.RuntimeException繼承自java.lang.Exception)。

看下面的異常結構圖或許層次感更加深些:

這裏寫圖片描述

2、異常分裝實例

2.一、添加一個枚舉LuoErrorCode.java以下:

package com.luo.errorcode;

public enum LuoErrorCode { NULL_OBJ("LUO001","對象爲空"), ERROR_ADD_USER("LUO002","添加用戶失敗"), UNKNOWN_ERROR("LUO999","系統繁忙,請稍後再試...."); private String value; private String desc; private LuoErrorCode(String value, String desc) { this.setValue(value); this.setDesc(desc); } public String getValue() { return value; } public void setValue(String value) { this.value = value; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } @Override public String toString() { return "[" + this.value + "]" + this.desc; } }

 

注意!!!這裏咱們重寫了LuoErrorCode的toString方法,至於爲何要這樣,後面會提到,客觀請繼續看。

2.二、建立一個異常類BusinessException.java,繼承RuntimeException:

package com.luo.exception; public class BusinessException extends RuntimeException { private static final long serialVersionUID = 1L; public BusinessException(Object Obj) { super(Obj.toString()); } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

這裏的代碼雖然短,可是有兩點須要注意的!!!第一點是其繼承了RuntimeException,由於通常咱們的業務異常都是運行時異常。第二點,這裏的構造方法調用父方法super(Obj.toString());,這就是重寫了LuoErrorCode的toString方法的緣由了,若是還不明白,看完後面的你就明白了。

2.三、測試類ExceptionTest.java:

package com.luo.test; import com.luo.errorcode.LuoErrorCode; import com.luo.exception.BusinessException; public class ExceptionTest { public static void main(String args[]) { Object user = null; if(user == null){ throw new BusinessException(LuoErrorCode.NULL_OBJ); } } }

運行結果:

這裏寫圖片描述

補充一下:在咱們實際項目裏面,好比別人調用你接口,你可能須要先看他傳過來的對象是否是空的,先判斷若是傳過來的對象爲空給有友好的提示」[LUO001]對象爲空」,否則後面的代碼估計會出現空指針異常了。

通常公司都會分裝一個基礎框架,異常分裝是其中一部分,固然他們對異常的分裝確定比我這個例子複雜多,所以本例僅供參考!

若是懶得copy和paste的話,直接下載工程吧:

http://download.csdn.net/detail/u013142781/9422684

 目錄

1、前言
2、實例詳解

轉載: Javaweb異常提示信息統一處理

1、前言

後臺出現異常如何友好而又高效地回顯到前端呢?直接將一堆的錯誤信息拋給用戶界面,顯然不合適。

先不考慮代碼實現,咱們但願是這樣的:

(1)若是是頁面跳轉的請求,出現異常了,咱們但願跳轉到一個異常顯示頁面,以下:

固然,這裏的界面不夠美觀,可是理論是這樣的。

(2)若是是ajax請求,那麼咱們,但願後臺將合理的錯誤顯示返回到ajax的回調函數裏面,以下:

$.ajax({ 
    type: "post", url: "<%=request.getContextPath()%>" + "/businessException.json", data: {}, dataType: "json", contentType : "application/json", success: function(data) { if(data.success == false){ alert(data.errorMsg); }else{ alert("請求成功無異常"); } }, error: function(data) { alert("調用失敗...."); } });

將回調函數的data.errorMsg打印出來:

下面,咱們根據上面的思路咱們來看看代碼的實現。所以本文實例包含了異常自定義分裝,爲了無障礙閱讀下文,請猿友移步先看完博主的另一篇文章:Java異常封裝(本身定義錯誤碼和描述,附源碼)

2、實例詳解

本實例使用的環境 eclipse+maven,其中maven只是爲了方便引入jar包。
使用的技術:springmvc

在Spring MVC中,全部用於處理在請求映射和請求處理過程當中拋出的異常的類,都要實現HandlerExceptionResolver接口。HandlerExceptionResolver接口有一個方法resolveException,當controller層出現異常以後就會進入到這個方法resolveException。

下面咱們直接實現HandlerExceptionResolver接口,代碼以下:

package com.luo.exceptionresolver; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import com.alibaba.druid.support.json.JSONUtils; import com.luo.exception.BusinessException; import org.springframework.web.servlet.HandlerExceptionResolver; public class MySimpleMappingExceptionResolver implements HandlerExceptionResolver { public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) { // 判斷是否ajax請求 if (!(request.getHeader("accept").indexOf("application/json") > -1 || (request .getHeader("X-Requested-With") != null && request.getHeader( "X-Requested-With").indexOf("XMLHttpRequest") > -1))) { // 若是不是ajax,JSP格式返回 // 爲安全起見,只有業務異常咱們對前端可見,不然不然統一歸爲系統異常 Map<String, Object> map = new HashMap<String, Object>(); map.put("success", false); if (exception instanceof BusinessException) { map.put("errorMsg", exception.getMessage()); } else { map.put("errorMsg", "系統異常!"); } //這裏須要手動將異常打印出來,因爲沒有配置log,實際生產環境應該打印到log裏面 exception.printStackTrace(); //對於非ajax請求,咱們都統一跳轉到error.jsp頁面 return new ModelAndView("/error", map); } else { // 若是是ajax請求,JSON格式返回 try { response.setContentType("application/json;charset=UTF-8"); PrintWriter writer = response.getWriter(); Map<String, Object> map = new HashMap<String, Object>(); map.put("success", false); // 爲安全起見,只有業務異常咱們對前端可見,不然統一歸爲系統異常 if (exception instanceof BusinessException) { map.put("errorMsg", exception.getMessage()); } else { map.put("errorMsg", "系統異常!"); } writer.write(JSONUtils.toJSONString(map)); writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } }

上面的代碼,歸結爲如下幾點:
(1)判斷若是不是ajax請求,那麼統一跳轉到error.jsp頁面,不然返回json數據。
(2)若是是業務異常,咱們直接打印異常信息,不然,咱們統一歸爲系統異常,若是不明白這裏的業務異常爲什麼物,請閱讀博主博客:Java異常封裝(本身定義錯誤碼和描述,附源碼)

另外,須要在springmvc配置文件添加以下配置:

<!-- 框架異常處理Handler --> <bean id="exceptionResolver" class="com.luo.exceptionresolver.MySimpleMappingExceptionResolver"></bean>

下面咱們直接看controller代碼:

package com.luo.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import com.luo.errorcode.LuoErrorCode; import com.luo.exception.BusinessException; @Controller public class UserController { @RequestMapping("/index.jhtml") public ModelAndView getIndex(HttpServletRequest request) throws Exception { ModelAndView mav = new ModelAndView("index"); return mav; } @RequestMapping("/exceptionForPageJumps.jhtml") public ModelAndView exceptionForPageJumps(HttpServletRequest request) throws Exception { throw new BusinessException(LuoErrorCode.NULL_OBJ); } @RequestMapping(value="/businessException.json", method=RequestMethod.POST) @ResponseBody public String businessException(HttpServletRequest request) { throw new BusinessException(LuoErrorCode.NULL_OBJ); } @RequestMapping(value="/otherException.json", method=RequestMethod.POST) @ResponseBody public String otherException(HttpServletRequest request) throws Exception { throw new Exception(); } }

關於controller代碼沒什麼好解釋的,下面咱們直接看結果吧:

(1)若是跳轉頁面過程當中出現異常,訪問http://localhost:8080/web_exception_project/exceptionForPageJumps.jhtml的結果:

(2)若是ajax請求過程當中出現異常,訪問http://localhost:8080/web_exception_project/index.jhtml,而後,點擊業務異常按鈕結果:

點擊其餘異常按鈕結果:

(3)HandlerExceptionResolver接口並不能處理404錯誤,這種錯誤咱們再web.xml裏面添加以下配置:

<!-- 錯誤跳轉頁面 --> <error-page> <!-- 路徑不正確 --> <error-code>404</error-code> <location>/WEB-INF/view/404.jsp</location> </error-page>

而後404.jsp代碼以下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <taglib uri="http://java.sun.com /jsp/jstl/core" prefix="c" /> <html> <head> <title>錯誤頁面</title> </head> <body> 頁面被黑洞吸走了...... </body> </html>

而後訪問一個不存在的鏈接:http://localhost:8080/web_exception_project/123456.jhtml,結果以下:

3、本工程源碼下載

http://download.csdn.net/detail/u013142781/9424969

 
分類:  Java Exception
相關文章
相關標籤/搜索