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

淺談Spring Boot 異常處理篇

 更新時間:2017年08月29日 09:03:23   作者:Anoyi  
本篇文章主要介紹了淺談Spring Boot 異常處理篇,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

先談談“異常處理”這件事。下面有 2 份偽代碼,對比下:

// ① 基于 if/else 判斷
if(deletePage(page) == E_OK){
 if(registry.deleteReference(page.name) == E_OK){
  if(configKeys.deleteKey(page.name.makeKey()) == E_OK){
   logger.log("page deleted");
  }else{
   logger.log("configKey not deleted");
  }
 }else{
  logger.log("deleteReference from registry failed");
 }
}else{
 logger.log("delete failed");
 return E_RROR;
}
// ② 基于異常處理
try{
 deletePage(page);
 registry.deleteReference(page.name);
 configKeys.deleteKey(page.name.makeKey());
}catch(Exception e){
 logError(e);
}

可以看出,如果使用異常替代返回錯誤碼,錯誤處理代碼就能從主路徑邏輯中分離出來,得到簡化!

②中,基于異常處理的代碼真的好嗎?其實是丑陋不堪的,它搞亂了代碼結構,把錯誤處理與正常流程混為一談。最好把 try 和 catch 代碼塊的主體部分抽離出來,形成另外的函數(shù)。

// ③ 優(yōu)雅的異常處理邏輯
public void delete(Page page){
 try{
  deletePageAndAllReferences(page);
 }catch(Exception e){
  logError(e);
 }
}

private void deletePageAndAllReferences(Page page) throw Exception{
 deletePage(page);
 registry.deleteReference(page.name);
 configKeys.deleteKey(page.name.makeKey());
}

private void logError(Exception e){
 logger.log(e.getMessage());
}

③中,函數(shù)各司其職,更易于理解和修改了。

總結:使用異常而不是錯誤碼,優(yōu)雅地使用異常!函數(shù)應該只做一件事,處理錯誤就是一件事。因此,處理錯誤的函數(shù)不該做其他事!

在 Spring Boot 中處理異常

1、默認的異常處理

例如 401,404,500,5XX 等異常,Spring Boot 默認會跳轉到預配置的頁面,此處以 thymeleaf 模板引擎為例:

+ resources
 + templates
  + error
   - 401.html
   - 404.html
   - 500.html

只需在 resources/templates/error/ 路徑下添加對應的html文件即可。

2、局部異常處理

局部異常一般處理業(yè)務邏輯出現(xiàn)的異常情況,在 Controller 下使用 @ExceptionHandler 注解來處理異常。舉個小例子:

先定義 ResponseBean 和 ExceptionEnum 兩個對象,輔助完成優(yōu)雅的代碼。

/**
 * 統(tǒng)一響應
 * @author anoy
 */
public class ResponseBean<T> {

  private int code;

  private String message;

  private T data;

  public ResponseBean(){}

  public ResponseBean(ExceptionEnum exceptionEnum){
    this.code = exceptionEnum.getCode();
    this.message = exceptionEnum.getMessage();
  }

  // 省略 setter/getter
}

/**
 * 異常類型枚舉
 * @author anoy
 */
public enum ExceptionEnum {

  GIRL_FRIEND_NOT_FOUND(100000, "girl friend not found");

  private int code;

  private String message;

  ExceptionEnum(int code, String message){
    this.code = code;
    this.message = message;
  }

  public int getCode() {
    return code;
  }

  public String getMessage() {
    return message;
  }
}

今天七夕,寫個 GirlFriendNotFoundException(很有同感,是不是?)

@Controller
public class UserController {

  @RequestMapping("/friend/{id}")
  public String friend(@PathVariable("id") Long id) throws GirlFriendNotFoundException {
    if (id == 1L){
      throw new GirlFriendNotFoundException();
    }
    return "friend";
  }

  @ExceptionHandler(GirlFriendNotFoundException.class)
  @ResponseBody
  public ResponseBean handleGirlFriendNotFound(GirlFriendNotFoundException exception){
    loggerError(exception);
    return new ResponseBean(ExceptionEnum.GIRL_FRIEND_NOT_FOUND);
  }
  
  private void logError(Exception e){
    logger.error(e.getMessage());
  }
}

3、全局異常處理

個人觀點:全局異常應該處理系統(tǒng)故障級別的問題,像參數(shù)校驗這種類型的異常,應該作為局部異常來處理,例如 Redis 連接斷開,無法請求數(shù)據(jù),這種異常就應該當做全局異常來處理,在異常處理的邏輯中,還應該添加通知到開發(fā)人員的功能,方便開發(fā)人員及時處理錯誤!

全局異常處理,使用 @ControllerAdvice @ExceptionHandler 來配合。

@ControllerAdvice
public class GlobalExceptionHandler {

  @ExceptionHandler(RedisConnectionFailureException.class)
  public void handlerRedisConnectionFailureException(RedisConnectionFailureException exception){
    logError(exception);
    noticeToDev();
  }

  private void logError(Exception e){
    logger.error(e.getMessage());
  }

  private void noticeToDev(){
    // 通知具體開發(fā)人員
  }

}

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

相關文章

  • 關于在Java中反轉數(shù)組的4種詳細方法

    關于在Java中反轉數(shù)組的4種詳細方法

    這篇文章主要介紹了關于在Java中反轉數(shù)組的4種詳細方法,數(shù)組是一個固定長度的存儲相同數(shù)據(jù)類型的數(shù)據(jù)結構,數(shù)組中的元素被存儲在一段連續(xù)的內存空間中,今天我們來學習一下如何反轉數(shù)組
    2023-05-05
  • 詳解Mybatis多參數(shù)傳遞入?yún)⑺姆N處理方式

    詳解Mybatis多參數(shù)傳遞入?yún)⑺姆N處理方式

    這篇文章主要介紹了詳解Mybatis多參數(shù)傳遞入?yún)⑺姆N處理方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • Java中的引用和動態(tài)代理的實現(xiàn)詳解

    Java中的引用和動態(tài)代理的實現(xiàn)詳解

    這篇文章主要介紹了Java中的引用和動態(tài)代理的實現(xiàn)詳解,涉及Java中的引用類型,JVMGC的可達性分析,代理模式等相關內容,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 使用log4j2打印mybatis的sql執(zhí)行日志方式

    使用log4j2打印mybatis的sql執(zhí)行日志方式

    這篇文章主要介紹了使用log4j2打印mybatis的sql執(zhí)行日志方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Spring源碼解析之循環(huán)依賴的實現(xiàn)流程

    Spring源碼解析之循環(huán)依賴的實現(xiàn)流程

    這篇文章主要介紹了Spring源碼解析之循環(huán)依賴的實現(xiàn)流程,文章基于Java的相關內容展開循環(huán)依賴的實現(xiàn)流程,需要的小伙伴可以參考一下
    2022-07-07
  • Spring Cloud Alibaba配置多環(huán)境管理詳解與實戰(zhàn)代碼

    Spring Cloud Alibaba配置多環(huán)境管理詳解與實戰(zhàn)代碼

    本文通過實際案例詳細介紹了springboot配置多環(huán)境管理的使用,以及基于nacos的配置多環(huán)境管理的實踐,在實際開發(fā)中,配置多環(huán)境管理是一個很難避開的問題,同時也是微服務治理中一個很重要的內容,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • Java模板方法模式定義算法框架

    Java模板方法模式定義算法框架

    Java模板方法模式是一種行為型設計模式,它定義了一個算法框架,由抽象父類定義算法的基本結構,具體實現(xiàn)細節(jié)由子類來實現(xiàn),從而實現(xiàn)代碼復用和擴展性
    2023-05-05
  • Java編程細節(jié)重構之為什么if-else不是好代碼詳析

    Java編程細節(jié)重構之為什么if-else不是好代碼詳析

    這篇文章主要給大家介紹了關于Java編程細節(jié)重構之為什么if-else不是好代碼的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學些學習吧
    2018-09-09
  • IDEA?2020.3最新永久激活碼(免費激活到?2099?年,親測有效)

    IDEA?2020.3最新永久激活碼(免費激活到?2099?年,親測有效)

    分享一下?IntelliJ?IDEA?2020.3.1?最新激活注冊碼,破解教程如下,可免費激活至?2099?年,親測有效,本文給大家分享兩種方法,感興趣的朋友參考下吧
    2021-01-01
  • 詳解Java中-classpath和路徑的使用

    詳解Java中-classpath和路徑的使用

    本篇文章主要介紹了Java中-classpath和路徑的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04

最新評論