前言
對于作為菜鳥程序員的我來說,經常在controller使用try-catch 來包裹住我的service層代碼,首頁,他及其的不好看,其次,每個方法都有這種代碼塊,思考有沒有辦法去掉它,并且優雅的處理異常。這就是今天要說的全局異常捕獲
提示:以下是本篇文章正文內容,下面案例可供參考
一、思路?
springboot提供了全局異常處理的注解,我們需要弄明白的是。撲捉什么異常,結果如果返回,如何優雅的管理返回的結果集。
二、步驟
1.自定義接口:
自定義接口主要是描述返回的code碼和返回msg,自定義錯誤描述枚舉需要實現這個接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public interface ErrorType { /** * 返回code * * @return */ String getCode(); /** * 返回mesg * * @return */ String getMesg(); } |
2.自定義錯誤枚舉
使用枚舉,看起來代碼很優雅,并且不用使用static final來定義類型。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@Getter public enum SystemErrorType implements ErrorType { SYSTEM_ERROR( "-1" , "系統異常" ), SYSTEM_BUSY( "000001" , "系統繁忙,請稍候再試" ); /** * 錯誤類型碼 */ private String code; /** * 錯誤類型描述信息 */ private String mesg; SystemErrorType(String code, String mesg) { this .code = code; this .mesg = mesg; } } |
3.自定義異常類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@Getter public class MyException extends RuntimeException{ /** * 異常對應的錯誤類型 */ private final ErrorType errorType; /** * 默認是系統異常 */ public MyException () { this .errorType = SystemErrorType.SYSTEM_ERROR; } public MyException(SystemErrorType systemErrorType) { this .errorType = systemErrorType; } |
4.異常捕獲
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@RestControllerAdvice @Slf4j public class GlobalExceptionHandlerAdvice extends DefaultGlobalExceptionHandlerAdvice { @ExceptionHandler (value = {MyException . class }) public Result MyException (MyException ex) { log.error(ex.getMessage()); return Result.fail(ex.getErrorType()); } @ExceptionHandler (value = {NotRoleException. class }) public Result NotRoleException(NotRoleException nle) { // 打印堆棧,以供調試 //nle.printStackTrace(); String message = "該功能僅供" +nle.getRole()+ "使用!" ; // 返回給前端 return Result.fail( "090017" ,message, null ); } } |
也不是說只能通過枚舉來返回,只要你的返回工具類支持參數填寫,可以做類似于第二種的返回,但是這樣方法對于返回的code來太好管理
5.在代碼中拋異常
比如我做判空處理時,利用枚舉作為參數返回
1
2
3
4
5
6
7
8
|
@PostMapping ( "/listQuestionVO" ) public Result listQuestionBankVO( @RequestBody QuestionBankQuery query){ if (query.getPageNum()== null || query.getPageSize()== null ){ return Result.fail(QuestionnaireErrorType.PARAMETERISNULL_ERROR); } Result result = questionBankService.listQuestionBankVO(query); return result; } |
實際上,你可以在你需要處理異常的地方直接throws異常,可以直接在方法上throws拋出,等待全局異常捕獲
總結
只要管理code到位,用返回類型的工具類來替換枚舉更適合小白
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!
原文鏈接:https://blog.csdn.net/qq_48329942/article/details/121034245