springboot
參考了各個(gè)大佬的寫法与学,因?yàn)橹霸诒镜貙懙奈臋n趟径,但是沒有記錄鏈接,如有侵權(quán)癣防,請(qǐng)聯(lián)系本人
springboot異常處理
異常處理的最佳實(shí)踐,主要遵循幾點(diǎn)
- 盡量不要在代碼里面寫try catch finally
- 異常盡量要直觀掌眠,防止被他人誤解
- 將異常分為以下幾類:業(yè)務(wù)異常蕾盯,登錄狀態(tài)無效異常,未授權(quán)異常蓝丙,系統(tǒng)異常
- 可以在某個(gè)特定的controller中處理異常级遭,也可以使用全局異常處理器。盡量使用全局異常處理器
異常處理流程:
- 首先自定義一個(gè)自己的異常類CustomeException,繼承RuntimeException,再寫一個(gè)異常管理類ExceptionManager,用來拋出自定義的異常
- 然后使用spring提供的注解@RestControllerAdvice或者@ControllerAdvice寫一個(gè)統(tǒng)一異常處理的類渺尘,在這個(gè)類中寫一個(gè)帶一個(gè)@ExceptionHandler(Exception.calss)注解的方法挫鸽,這個(gè)方法接收到所有拋出的異常,在方法內(nèi)我們可以寫自己的異常處理邏輯
- 如果參數(shù)是CustomerException類型鸥跟,我們就自定義異常字典的錯(cuò)誤信息丢郊,如果是其他類型的異常就返回系統(tǒng)異常
talk is cheap盔沫,show me the code
-
自定義的異常類
@Data
@NoArgsConstructor
public class CustomException extends RuntimeException {public CustomException(String code, String msg) { super(code); this.code = code; this.msg = msg; } private String code; private String msg;
}
-
異常管理類
@Component
public class ExceptionManager {@Resource Environment environment; public CustomException create(String code) { return new CustomException(code, environment.getProperty(code)); }
}
Environment 是spring的環(huán)境類,會(huì)包含所有properties文件的鍵值對(duì)
- 異常字典
sso異常測(cè)試
EC00001=SSO的WEB層錯(cuò)誤
需要加載到spring的環(huán)境中枫匾,我是用配置類加載的架诞,方式如下:
@Component
@PropertySource(value = {"exception.properties"}, encoding = "UTF-8")
public class LoadProperty {
}
-
全局異常捕獲類
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)
public ApiResult handlerException(Exception e) {//如果是自定義的異常,返回對(duì)應(yīng)的錯(cuò)誤信息 if (e instanceof CustomException) { e.printStackTrace(); CustomException exception = (CustomException) e; return ApiResult.error(exception.getCode(), exception.getMsg()); } else { //如果不是已知異常干茉,返回系統(tǒng)異常 e.printStackTrace(); return ApiResult.error("SYS_EXCEPTION", "系統(tǒng)異常"); }
}
}
- 使用示例
@RestController
@RequestMapping("/exception")
public class ExceptionController {
@Resource
ExceptionManager exceptionManager;
@RequestMapping("/controller")
public String exceptionInController() {
if (true) {
throw exceptionManager.create("EC00001");
}
return "controller exception!";
}
}
返回信息:
{
"code": "EC00001",
"msg": "SSO的WEB層錯(cuò)誤"
}
?