亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Boot中怎么對異常進行處理

發布時間:2020-12-03 14:50:03 來源:億速云 閱讀:173 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關Spring Boot中怎么對異常進行處理,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

先談談“異常處理”這件事。下面有 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 代碼塊的主體部分抽離出來,形成另外的函數。

// ③ 優雅的異常處理邏輯
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());
}

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

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

在 Spring Boot 中處理異常

1、默認的異常處理

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

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

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

2、局部異常處理

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

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

/**
 * 統一響應
 * @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、全局異常處理

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

全局異常處理,使用 @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(){
    // 通知具體開發人員
  }

}

看完上述內容,你們對Spring Boot中怎么對異常進行處理有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

张家界市| 老河口市| 若羌县| 定边县| 易门县| 巫溪县| 昔阳县| 南通市| 海口市| 札达县| 织金县| 南乐县| 嘉荫县| 四会市| 凤冈县| 沈丘县| 东乌珠穆沁旗| 吉木萨尔县| 合水县| 平乐县| 浮山县| 拉孜县| 资兴市| 米脂县| 阿拉善盟| 唐山市| 拜泉县| 荆州市| 龙陵县| 双流县| 洛扎县| 泾阳县| 镇远县| 古丈县| 谷城县| 克什克腾旗| 郴州市| 舒兰市| 平顺县| 曲麻莱县| 拉萨市|