成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從零搭建后端框架——異常統一處理的三種方式

新聞 前端
三種方式都能很好對異常進行統一處理,但是一般推薦使用@ControllerAdvice + @ExceptionHandler方式, 這樣能夠使異常處理與業務邏輯分離,并且不用自己處理Json數據返回。

 [[327655]]

前言

項目在運行時出現異常時,如若沒有對異常進行捕獲并處理,就會出現如下頁面:

從零搭建后端框架——異常統一處理的三種方式

這樣顯然對用戶是極其不友好的。

后端不應該直接返回錯誤頁面,而應返回統一的錯誤信息,比如:

  1. "code"500
  2. "data"null
  3. "message""服務異常,請稍后重試" 
  4. 復制代碼 

然后,前端根據返回的信息,顯示友好的提示頁面。

Spring提供了三種方式對異常統一處理:

  1. @ExceptionHandler
  2. 實現HandlerExceptionResolver接口
  3. @ControllerAdvice + @ExceptionHandler

下面我們來實際操作下。

具體實現

@ExceptionHandler

在【統一基類、接口、返回對象設計】這一篇文章中, 定義了Controller的基類BaseController,所以只要在BaseController中使用@ExceptionHandler處理異常, 其它Controller繼承BaseController即可。實現如下:

  1. @Slf4j 
  2. public abstract class BaseController { 
  3.  
  4. /** 
  5. * BusinessException 異常處理 
  6. */ 
  7. @ResponseBody 
  8. @ExceptionHandler(BusinessException.class
  9. public ApiResult businessExceptionHandler(BusinessException e) { 
  10. log.error(e.getMessage(), e); 
  11. // do something 
  12. return ApiResult.fail(e.getMessage()); 
  13.  
  14. /** 
  15. * Exception 異常處理 
  16. */ 
  17. @ResponseBody 
  18. @ExceptionHandler(Exception.class
  19. public ApiResult exceptionHandler(Exception e) { 
  20. log.error(e.getMessage(), e); 
  21. return ApiResult.fail("服務異常,請稍后重試"); 
  22. 復制代碼 

這里對異常BusinessException和Exception進行了處理, BusinessException是約定的業務異常的基類,若是主動拋出一般都要求是BusinessException的子類,都會被businessExceptionHandler處理。 若是其它異常,可能是意想不到的異常,則會被exceptionHandler處理。

統一處理后,返回結果如下:

從零搭建后端框架——異常統一處理的三種方式

實現HandlerExceptionResolver接口

  1. @Slf4j 
  2. @Component 
  3. public class GlobalHandlerExceptionResolver implements HandlerExceptionResolver { 
  4.  
  5. @Override 
  6. public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) { 
  7. log.error(e.getMessage(), e); 
  8. ApiResult apiResult; 
  9. if (e instanceof BusinessException) { 
  10. BusinessException be = (BusinessException) e; 
  11. // do something 
  12. apiResult = ApiResult.fail(be.getMessage()); 
  13. else { 
  14. apiResult = ApiResult.fail("服務異常,請稍后重試"); 
  15. WebUtils.writeJson(response, apiResult); 
  16. return null
  17. 復制代碼 

該方式需要實現HandlerExceptionResolver接口,然后將實現類注入到Spring容器中。

但第一種方式中,通過@ResponseBody注解,Spring就幫我們返回了json格式數據,而這需要自己實現。

這里實現了工具類WebUtils,用于返回json數據,如下:

  1. public class WebUtils { 
  2.  
  3. private static final Logger log = LoggerFactory.getLogger(WebUtils.class); 
  4.  
  5. private static Gson gson = new GsonBuilder().serializeNulls().create(); 
  6.  
  7. /** 
  8. * 返回json數據 
  9. * 
  10. * @param response 
  11. * @param object 
  12. */ 
  13. public static void writeJson(HttpServletResponse response, int status, Object object) { 
  14. response.setHeader("Content-Type""application/json;charset=UTF-8"); 
  15. response.setContentType("application/json;charset=UTF-8"); 
  16. response.setStatus(status); 
  17. PrintWriter out = null
  18. try { 
  19. String data = object instanceof String ? (String) object : gson.toJson(object); 
  20. out = response.getWriter(); 
  21. out.print(data); 
  22. out.flush(); 
  23. catch (Exception e) { 
  24. log.error(e.getMessage(), e); 
  25. finally { 
  26. if (out != null) { 
  27. out.close(); 
  28.  
  29. /** 
  30. * 返回json數據 
  31. * 
  32. * @param response 
  33. * @param object 
  34. */ 
  35. public static void writeJson(HttpServletResponse response, Object object) { 
  36. writeJson(response, HttpServletResponse.SC_OK, object); 
  37.  
  38. /** 
  39. * 返回json數據 
  40. * 
  41. * @param response 
  42. * @param object 
  43. */ 
  44. public static void writeJson(ServletResponse response, Object object) { 
  45. if (response instanceof HttpServletResponse) { 
  46. writeJson((HttpServletResponse) response, object); 
  47. 復制代碼 

工具類中使用了Gson,需要引用:

  1. <dependency> 
  2. <groupId>com.google.code.gson</groupId> 
  3. <artifactId>gson</artifactId> 
  4. </dependency> 
  5. 復制代碼 

@ControllerAdvice + @ExceptionHandler

該方式與第一種方式類似,如下:

  1. @Slf4j 
  2. @ControllerAdvice 
  3. public class GlobalExceptionHandler { 
  4.  
  5. /** 
  6. * BusinessException 異常處理 
  7. */ 
  8. @ResponseBody 
  9. @ExceptionHandler(BusinessException.class
  10. public ApiResult businessExceptionHandler(BusinessException e) { 
  11. log.error(e.getMessage(), e); 
  12. // do something 
  13. return ApiResult.fail(e.getMessage()); 
  14.  
  15. /** 
  16. * Exception 異常處理 
  17. */ 
  18. @ResponseBody 
  19. @ExceptionHandler(Exception.class
  20. public ApiResult exceptionHandler(Exception e) { 
  21. log.error(e.getMessage(), e); 
  22. return ApiResult.fail("服務異常,請稍后重試"); 
  23. 復制代碼 

總結

三種方式都能很好對異常進行統一處理,但是一般推薦使用@ControllerAdvice + @ExceptionHandler方式, 這樣能夠使異常處理與業務邏輯分離,并且不用自己處理Json數據返回。

源碼

github.com/zhuqianchan…

 

責任編輯:張燕妮 來源: 今日頭條
相關推薦

2025-02-13 00:34:22

Spring對象系統

2024-08-09 08:25:32

Spring流程注解

2023-12-05 14:10:00

接口可讀性

2019-08-22 14:02:00

Spring BootRestful APIJava

2020-11-01 17:10:46

異步事件開發前端

2018-04-27 14:18:01

2025-01-13 00:00:00

MapStruct繼承關系Java

2020-11-10 10:21:31

架構try...catch代碼

2022-05-30 08:03:06

后端參數校驗異常處理

2012-07-17 09:16:16

SpringSSH

2010-02-04 10:33:40

C++異常傳遞

2019-10-09 13:39:39

Python編程語言異常錯誤

2020-01-02 22:32:00

物聯網智能零售RFID

2017-07-31 15:47:50

Zuul統一處理

2021-11-05 21:33:28

Redis數據高并發

2019-11-20 18:52:24

物聯網智能照明智能恒溫器

2014-12-31 17:42:47

LBSAndroid地圖

2021-06-24 08:52:19

單點登錄代碼前端

2010-03-12 17:52:35

Python輸入方式

2009-08-06 15:26:18

C#異常類型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久成人精品免费播放动漫 | 国产乱性| 色婷婷精品国产一区二区三区 | 夜夜草| 久久久一区二区三区四区 | 免费艹逼视频 | h片在线观看网站 | www国产成人免费观看视频,深夜成人网 | 日本一区二区高清不卡 | 国产精品免费一区二区三区四区 | 亚洲激情在线观看 | 久久精品小视频 | 91精品国产色综合久久不卡98口 | 日韩欧美一级精品久久 | 五月激情久久 | 国产ts人妖另类 | 欧美一区二区成人 | 成人精品视频免费 | 欧美一区二区三区在线观看视频 | 欧美一区二区三区免费在线观看 | 欧美精品一区二区三区四区五区 | 羞羞视频在线观免费观看 | 亚洲国产网站 | av永久免费 | 91福利在线观看 | 日韩精品一区二区三区视频播放 | 久久久久91 | 色就干| 人人爱干 | 国产超碰人人爽人人做人人爱 | 青久草视频 | 国产高清精品一区 | 9191在线播放 | 91一区二区| 波多野结衣一二三区 | 91中文视频 | 国产精品精品久久久 | 日韩视频在线一区 | 午夜寂寞网站 | 亚洲成人三级 | 综合久久色|