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

淺談Spring Boot 異常處理篇

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

前言

先談?wù)劇爱惓L幚怼边@件事。下面有 2 份偽代碼,對(duì)比下:

// ① 基于 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);
}

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

②中,基于異常處理的代碼真的好嗎?其實(shí)是丑陋不堪的,它搞亂了代碼結(jié)構(gòu),把錯(cuò)誤處理與正常流程混為一談。最好把 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ù)各司其職,更易于理解和修改了。

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

在 Spring Boot 中處理異常

1、默認(rèn)的異常處理

例如 401,404,500,5XX 等異常,Spring Boot 默認(rèn)會(huì)跳轉(zhuǎn)到預(yù)配置的頁面,此處以 thymeleaf 模板引擎為例:

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

只需在 resources/templates/error/ 路徑下添加對(duì)應(yīng)的html文件即可。

2、局部異常處理

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

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

/**
 * 統(tǒng)一響應(yī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;
  }
}

今天七夕,寫個(gè) 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、全局異常處理

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

全局異常處理,使用 @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ā)人員
  }

}

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot工具類FileCopyUtils使用教程

    Springboot工具類FileCopyUtils使用教程

    這篇文章主要介紹了Springboot內(nèi)置的工具類之FileCopyUtils的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12
  • Eclipse智能提示及快捷鍵

    Eclipse智能提示及快捷鍵

    本文主要介紹了Eclipse智能提示及快捷鍵的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • Java適配器模式應(yīng)用之電源適配器功能詳解

    Java適配器模式應(yīng)用之電源適配器功能詳解

    這篇文章主要介紹了Java適配器模式應(yīng)用之電源適配器功能,較為詳細(xì)的分析了適配器模式的概念、原理及Java基于適配器模式實(shí)現(xiàn)電源適配器功能的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-05-05
  • Spring MVC-@RequestMapping注解詳解

    Spring MVC-@RequestMapping注解詳解

    @RequestMapping注解的作用,就是將請(qǐng)求和處理請(qǐng)求的控制器方法關(guān)聯(lián)起來,建立映射關(guān)系。這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • java環(huán)境中的JDK、JVM、JRE詳細(xì)介紹

    java環(huán)境中的JDK、JVM、JRE詳細(xì)介紹

    這篇文章主要介紹了java環(huán)境中的JDK、JVM、JRE詳細(xì)介紹的相關(guān)資料,對(duì)于初學(xué)者還是有必要了解下,細(xì)致說明他們是什么,需要的朋友可以參考下
    2016-11-11
  • SpringBoot模擬員工數(shù)據(jù)庫并實(shí)現(xiàn)增刪改查操作

    SpringBoot模擬員工數(shù)據(jù)庫并實(shí)現(xiàn)增刪改查操作

    這篇文章主要給大家介紹了關(guān)于SpringBoot模擬員工數(shù)據(jù)庫并實(shí)現(xiàn)增刪改查操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 詳解Spring系列之@ComponentScan批量注冊(cè)bean

    詳解Spring系列之@ComponentScan批量注冊(cè)bean

    本文介紹各種@ComponentScan批量掃描注冊(cè)bean的基本使用以及進(jìn)階用法和@Componet及其衍生注解使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-02-02
  • 整理很詳細(xì)的Java正則表達(dá)式使用大全

    整理很詳細(xì)的Java正則表達(dá)式使用大全

    這篇文章為大家整理了很詳細(xì)的Java正則表達(dá)式使用大全,大家在使用Java正則表達(dá)式的時(shí)候可查閱這篇文章,認(rèn)為不錯(cuò)的朋友可以收藏起來
    2015-12-12
  • SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗(yàn)證的方法

    SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗(yàn)證的方法

    本篇文章主要介紹了SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗(yàn)證的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • java用接口、多態(tài)、繼承、類計(jì)算三角形和矩形周長及面積的方法

    java用接口、多態(tài)、繼承、類計(jì)算三角形和矩形周長及面積的方法

    這篇文章主要介紹了java用接口、多態(tài)、繼承、類計(jì)算三角形和矩形周長及面積的方法,涉及java面向?qū)ο笾蓄悺⒔涌?、多態(tài)等的使用技巧,需要的朋友可以參考下
    2015-05-05

最新評(píng)論

平阴县| 南华县| 平舆县| 亚东县| 改则县| 绥化市| 兴化市| 惠水县| 吉木萨尔县| 新兴县| 聊城市| 阿尔山市| 桂平市| 湄潭县| 英超| 大悟县| 凯里市| 白沙| 建始县| 宁都县| 历史| 汶川县| 商洛市| 施秉县| 汪清县| 安溪县| 武威市| 绥化市| 万安县| 巨野县| 来宾市| 图木舒克市| 英吉沙县| 峨边| 汝州市| 襄汾县| 郴州市| 保德县| 乌拉特后旗| 平湖市| 彩票|