最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Spring boot/Spring 統(tǒng)一錯誤處理方案的使用

 更新時間:2018年06月18日 11:33:41   作者:明人不說暗話___我喜歡你  
這篇文章主要介紹了詳解Spring boot/Spring 統(tǒng)一錯誤處理方案的使用,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

當我們開發(fā)spring web應用程序時,對于如 IOException , ClassNotFoundException 之類的檢查異常,往往編譯器會提示程序員采用 try-catch 進行顯式捕獲,而對于像 ClassCastException , NullPointerException 這類非檢查異常,編譯器是不會提示你了,這往往也是能體現程序員代碼編寫能力的一個方面。

在spring web特別是spring-boot應用中,當一個請求調用成功時,一般情況下會返回 json 格式的對象,就像下面圖所示:

 

但如果請求拋出了一個 RuntimeException 呢?如果我們不做處理,再次調用時將出現下面的頁面:

也就是說當調用出現錯誤時,spring-boot默認會將請求映射到 /error 路徑中去,如果沒有相應的路徑請求處理器,那么就會返回上面的 Whitelabel 錯誤頁面。

1、自定義錯誤處理頁面

當然對運行時異常不做處理是不可能的啦!通常的做法是自定義統(tǒng)一錯誤頁面,然后返回。按照上面的思路,我們實現一個請求路徑為 /error 的控制器,控制器返回一個資源路徑地址,定義請求映射路徑為 /error 的控制器并實現 ErrorController 接口,代碼如下:

MyErrorPageController

package com.example.demo.controller.handler.errorpage;

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 
 * The class MyErrorPageController.
 *
 * Description:自定義錯誤頁面
 *
 * @author: huangjiawei
 * @since: 2018年6月13日
 * @version: $Revision$ $Date$ $LastChangedBy$
 *
 */
@Controller
public class MyErrorPageController implements ErrorController {
  
  @RequestMapping("/error")
  public String handleError() {
  	return "error.html"; // 該資源位于resources/static目錄下
  }
  
  @Override
  public String getErrorPath() {
  	return null;
  }
}

然后在 reosurces/static 目錄下建立 error.html 文件:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>這是個錯誤頁面!存放在resources/static目錄下,spring-boot發(fā)生錯誤時默認調用</h1>
</body>
</html>

再次請求 http://localhost:7000/demo/getUserInfoWithNoHandler.json ,如下:

2、使用 @ControllerAdvice 、 @ResponseBody@ExceptionHandler 統(tǒng)一處理異常

在spring中可以使用上面3個注解進行統(tǒng)一異常處理,默認情況下我們可以針對系統(tǒng)中出現的某種類型的異常定義一個統(tǒng)一的處理器handler,比如說系統(tǒng)拋出了一個 NullPointerException ,那么我們可以定義一個專門針對 NullPointerException 的處理器,代碼如下:

getUserInfoWithNullPointerException 接口

/**
 * 測試空指針錯誤的處理
 * @return
 * @throws NullPointerException
 */
@RequestMapping(value = "getUserInfoWithNullPointerException.json", method = RequestMethod.GET)
public Student getUserInfoWithNullPointerException() throws NullPointerException {
	throw new NullPointerException();
}

NullPointerExceptionHandler.java

package com.example.demo.controller.handler;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import com.example.demo.pojo.ErrorReturn;

/**
 * 
 * The class NullPointerExceptionHandler.
 *
 * Description:處理空指針
 *
 * @author: huangjiawei
 * @since: 2018年6月13日
 * @version: $Revision$ $Date$ $LastChangedBy$
 *
 */
@ControllerAdvice
public class NullPointerExceptionHandler {
  @ExceptionHandler(NullPointerException.class)
  @ResponseBody
  public ErrorReturn dealNullPointerException() {
    e.printStackTrace();
  	ErrorReturn error = new ErrorReturn();
  	error.setReturnCode("-1");
  	error.setDesc("出現空指針異常啦!");
  	return error;
  }
}

瀏覽器執(zhí)行: http://localhost:7000/demo/getUserInfoWithNullPointerException.json

同樣的道理,如果我們還需要為其他的運行時異常提供統(tǒng)一的處理器,那么也可以像上面一樣為每一個異常類型定義一個處理器,比如我們又想為 ArithmeticException 定義處理器,那么我們只需要建立一個類或者方法,然后在方法上的 @ExceptionHanler 注解內加上 ArithmeticException.class 指定異常類型即可。

不過你有沒有發(fā)現,這樣為每種異常類型定義一個異常處理類或者方法,因為運行時異常類型特別多,不可能為每種類型都指定一個處理器類或方法,針對這種情況,spring也是可以解決的。如果我們沒有為某種特定類型異常,如 ArithmeticException 定義處理器,那么我們可以定義一個 Exception 或者 Throwable 處理器統(tǒng)一處理。

這樣做的好處是,減少了處理器類的數量,同時將異常處理轉移到父類上面去,這也是繼承的一大優(yōu)勢吧!但是,當你既定義了特定類型的異常,同時又定義了 Exception 異常的處理器,那么要小心了,這里不一定有優(yōu)先級的關系,也就是說不一定會出現只執(zhí)行父異常處理器的情況,可能是只執(zhí)行A處理器,而不執(zhí)行B處理器或者只執(zhí)行B處理器,不執(zhí)行A處理器。如 NullPointerExceptionHandler 異常會向 Exception 異常傳遞(但 ArithmeticException 不會向 Exception 傳遞)

現在假設我們既定義上面的 NullPointerExceptionHandler ,又定義了下面的 ExceptionThrowableHandler ,那么當發(fā)生 NullPointerException 時,就會默認執(zhí)行 ExceptionThrowableHandler 的方法。

ExceptionThrowableHandler.java

package com.example.demo.controller.handler;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import com.example.demo.pojo.ErrorReturn;

/**
 * 
 * The class ExceptionThrowableHandler.
 *
 * Description:有些異常會向高級別異常傳遞(但ArithmeticException不會向Exception傳送)
 *
 * @author: huangjiawei
 * @since: 2018年6月13日
 * @version: $Revision$ $Date$ $LastChangedBy$
 *
 */
@ControllerAdvice
public class ExceptionThrowableHandler {
  
  @ExceptionHandler(Throwable.class)
  @ResponseBody
  public ErrorReturn dealThrowable() {
  	ErrorReturn error = new ErrorReturn();
  	error.setDesc("處理Throwable!");
  	error.setReturnCode("-1");
  	return error;
  }
  
  @ExceptionHandler(Exception.class)
  @ResponseBody
  public ErrorReturn dealCommonException() {
  	ErrorReturn error = new ErrorReturn();
  	error.setReturnCode("-1");
  	error.setDesc("公共異常處理!");
  	return error;
  }
}

瀏覽器執(zhí)行 : http://localhost:7000/demo/getUserInfoWithNullPointerException.json

可以發(fā)現只執(zhí)行 Exception 的處理器,沒有執(zhí)行空指針的處理器,也就是異常處理往上傳送了。下面再來看看拋出 ArithmeticException 的情況:

getUserInfoWithArithmeticException.json

/**
 * 測試空指針錯誤的處理
 * @return
 * @throws NullPointerException
 */
@RequestMapping(value = "getUserInfoWithArithmeticException.json", method = RequestMethod.GET)
public Student getUserInfoWithArithmeticException() throws ArithmeticException {
	throw new ArithmeticException();
}

ArithmeticExceptionHandler.java

package com.example.demo.controller.handler;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import com.example.demo.pojo.ErrorReturn;

@ControllerAdvice
public class ArithmeticExceptionHandler {
  /**
   * 處理ArithmeticException異常
   * @return
   */
  @ResponseBody
  @ExceptionHandler(ArithmeticException.class)
  public ErrorReturn dealArithmeticException() {
  	ErrorReturn errorObject = new ErrorReturn();
  	errorObject.setReturnCode("-1");
  	errorObject.setDesc("算數處理出現異常!");
  	return errorObject;
  }
}

瀏覽器執(zhí)行 : http://localhost:7000/demo/getUserInfoWithArithmeticException.json

結果發(fā)現異常處理并沒有往上層的 ExceptionHandler 傳送。

總結:對于既定義特定類型的處理器,又定義 Exception 等父類型的處理器時要特別小心,并不是所有的異常都會往上級處理,如果我們想只減少處理器類的數量,不想為每種特定類型的處理器添加類或者方法,那么小編建議使用 instanceof 關鍵字對異常類型進行判斷即可。

如下面的代碼,我們只建立一個公共的異常處理器,處理 Exception 異常,同時使用 instanceof 進行判斷。

@ExceptionHandler(Exception.class)
@ResponseBody
public ErrorReturn dealCommonException(Exception e) {
  ErrorReturn error = new ErrorReturn();
  // 此處可以采用 instanceof 判斷異常類型
  if (e instanceof ArithmeticException) {
  	error.setReturnCode("-1");
  	error.setDesc("算數異常處理!");
  	return error;
  }
  System.err.println("exception");
  error.setReturnCode("-1");
  error.setDesc("公共異常處理!");
  return error;
}

瀏覽器執(zhí)行拋出 ArithmeticException 的接口,如下:

本文代碼地址: https://github.com/SmallerCoder/spring_exceptionHandler

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java異或運算應用場景詳解

    Java異或運算應用場景詳解

    這篇文章主要給大家介紹了關于Java異或運算應用場景的相關資料,異或運算會應用在很多算法題中,這里整理了幾個最常見的應用場景,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • jstl EL表達式遍歷Map的方法

    jstl EL表達式遍歷Map的方法

    這篇文章主要介紹了jstl EL表達式遍歷Map的方法的相關資料,需要的朋友可以參考下
    2016-12-12
  • mybatis的test坑及解決(不等于‘‘ 且 不等于0)

    mybatis的test坑及解決(不等于‘‘ 且 不等于0)

    這篇文章主要介紹了mybatis的test坑及解決(不等于‘‘ 且 不等于0),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 完美解決Eclipse導入的項目上有個紅叉,但不影響項目運行的問題

    完美解決Eclipse導入的項目上有個紅叉,但不影響項目運行的問題

    這篇文章主要介紹了完美解決Eclipse導入的項目上有個紅叉,但不影響項目運行的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java并發(fā)之串行線程池實例解析

    Java并發(fā)之串行線程池實例解析

    這篇文章主要介紹了Java并發(fā)之串行線程池實例解析,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • 淺析java的foreach循環(huán)

    淺析java的foreach循環(huán)

    foreach語句是java5之后的新特征之一,在循環(huán)遍歷數組、集合方面更加簡潔,有需要的朋友可以參考一下
    2013-12-12
  • 淺談Spring解決循環(huán)依賴的三種方式

    淺談Spring解決循環(huán)依賴的三種方式

    本篇文章主要介紹了淺談Spring循環(huán)依賴的三種方式,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Java基礎之toString的序列化 匿名對象 復雜度精解

    Java基礎之toString的序列化 匿名對象 復雜度精解

    序列化即為把內存中的對象轉換為字節(jié)寫入文件或通過網絡傳輸到遠端服務器,本章節(jié)將帶你了解Java toString的序列化 匿名對象 復雜度,需要的朋友可以參考下
    2021-09-09
  • 三分鐘帶你了解SpringBoot真正的啟動引導類

    三分鐘帶你了解SpringBoot真正的啟動引導類

    這篇文章主要介紹了三分鐘帶你了解SpringBoot真正的啟動引導類,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Java異常類型以及處理實例詳解

    Java異常類型以及處理實例詳解

    在程序設計中,進行異常處理是非常關鍵和重要的一部分,一個程序的異常處理框架的好壞直接影響到整個項目的代碼質量以及后期維護成本和難度,這篇文章主要給大家介紹了關于Java異常類型以及處理的相關資料,需要的朋友可以參考下
    2021-07-07

最新評論

葫芦岛市| 临沭县| 徐汇区| 绥江县| 沈阳市| 乐山市| 嘉祥县| 井陉县| 封开县| 乌审旗| 拜泉县| 全南县| 南充市| 天峨县| 晴隆县| 连南| 普定县| 青阳县| 大名县| 临猗县| 日喀则市| 广昌县| 昌黎县| 西城区| 七台河市| 景洪市| 融水| 淄博市| 朔州市| 宁国市| 余江县| 基隆市| 唐河县| 永年县| 祁门县| 新宾| 怀宁县| 清远市| 沙洋县| 孝义市| 大埔区|