遂溪手機(jī)網(wǎng)站建設(shè)公司百度指數(shù)專業(yè)版app
一、目的
? ? ? ? 當(dāng)客戶端/前端向服務(wù)端發(fā)送一個(gè)請(qǐng)求后,這個(gè)請(qǐng)求并不是每次都能完全正確的處理,比如出現(xiàn)一些資源不存在、參數(shù)錯(cuò)誤或者內(nèi)部錯(cuò)誤等信息的時(shí)候,就需要將異常反饋給客戶端或者前端。那么這就需要程序有完整的異常處理機(jī)制。
? ? ? ? 在 Java 中所有異常的基類都是 Throwable 延伸出來(lái),但通常不使用 Throwable,在該基類延伸出來(lái) Error 和 Exception 兩種異常,嚴(yán)格意義上講 Error 不屬于異常,而是錯(cuò)誤,Exception 才是異常,兩者有什么區(qū)別呢?
? ? ? ? 錯(cuò)誤:所謂錯(cuò)誤就是應(yīng)用發(fā)生錯(cuò)誤的是就啟動(dòng)不起來(lái),一般都是操作系統(tǒng)或者是 JVM 級(jí)別上發(fā)生的錯(cuò)誤,一旦發(fā)生錯(cuò)誤,我們是無(wú)法通過(guò)代碼來(lái)進(jìn)行處理的;
? ? ? ?異常: Exception 一般是我們可以通過(guò)代碼來(lái)進(jìn)行處理的,例如我們平時(shí)查詢數(shù)據(jù)庫(kù)沒有找到某一條記錄,就是一個(gè)典型的空異常,再比如我們進(jìn)行計(jì)算的時(shí)候,分母為 0, 也會(huì)報(bào)一個(gè)異常。
? ? ? ?Error 在平常工作我們是不需要處理,重點(diǎn)就是 Exception,Exception 又分為兩種,一種是 CheckedException 異常,另一種是 RuntimeException 異常;這兩個(gè)異常的區(qū)別是 CheckedException 要求必須在代碼中進(jìn)行處理,如果不處理,程序連編譯都無(wú)法通過(guò);RuntimeException不要求強(qiáng)制進(jìn)行處理,因?yàn)檫@個(gè)異常屬于運(yùn)行的異常,不一定在編譯階段就能發(fā)現(xiàn)。
二、實(shí)現(xiàn)
? ? ? ? SpringBoot中,@ControllerAdvice 即可開啟全局異常處理,使用該注解表示開啟了全局異常的捕獲,我們只需在自定義一個(gè)方法使用@ExceptionHandler注解然后定義捕獲異常的類型即可對(duì)這些捕獲的異常進(jìn)行統(tǒng)一的處理。
一、定義一個(gè)全局異常處理類
@RestControllerAdvice
public class GlobalExceptionAdvice {// 處理已知異常(自定義異常)@ExceptionHandler(NepException.class)public ResponseEntity handleNepException(NepException e) {return new ResponseEntity(400, "空指針異常" + e.getMessage(), "");}// 未知異常@ExceptionHandler(Exception.class)public ResponseEntity handleException(Exception e) {return new ResponseEntity(400, "未知異常" + e.getMessage(), "");}}
二、返回體
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResponseEntity {private Integer code;private String message;private Object data;
}
3、全局運(yùn)行時(shí)異常攔截
@GetMapping("/aa")
public ResponseEntity aa(){double a = 1/0;return new ResponseEntity(200,"請(qǐng)求成功","");
}@GetMapping("bb")
public ResponseEntity bb(){ResponseEntity responseEntity = null;try {responseEntity.getCode();}catch (NullPointerException nullPointerException){throw new NepException();}return new ResponseEntity(200,"請(qǐng)求成功","");
}
四、自定義異常類
public class NepException extends NullPointerException{}
五、全局異常返回
四、總結(jié)
整個(gè)流程就是全局異常攔截,當(dāng)然不止這一行幾行代碼,很多地方都可以根據(jù)我們自身實(shí)際業(yè)務(wù)情況以此為基礎(chǔ)進(jìn)一步豐富,比如返回?cái)?shù)據(jù)可以改成跳轉(zhuǎn)某一個(gè)具體的頁(yè)面。這樣的出場(chǎng)方式是不是都很優(yōu)雅。總的來(lái)說(shuō),我們可以根據(jù)自身業(yè)務(wù)和實(shí)際需求對(duì)異常進(jìn)行全局處理。