SpringMVC @ExceptionHandler典型用法及說明
處理單個異常類型
當(dāng) getUser() 方法拋出 UserNotFoundException 時,會自動調(diào)用 handleUserNotFound() 方法進行處理。
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
// 可能拋出 UserNotFoundException
return userService.getUserById(id);
}
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<String> handleUserNotFound(UserNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
}
處理多個異常類型
一個 @ExceptionHandler 方法可以處理多個異常類型:
@ExceptionHandler({IllegalArgumentException.class, ResourceNotFoundException.class})
public ResponseEntity<String> handleClientErrors(RuntimeException ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("客戶端錯誤: " + ex.getMessage());
}
結(jié)合 @ResponseStatus 使用(返回指定狀態(tài)碼)
此時返回值直接作為響應(yīng)體,HTTP 狀態(tài)碼由 @ResponseStatus 指定。
@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String handleResourceNotFound(ResourceNotFoundException ex) {
return ex.getMessage();
}
返回結(jié)構(gòu)化錯誤信息(推薦做法)
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<ErrorResponse> handleUserNotFound(UserNotFoundException ex) {
ErrorResponse error = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage(), LocalDateTime.now());
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);
}
// ErrorResponse 示例類
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ErrorResponse {
private int status;
private String message;
private LocalDateTime timestamp;
}
捕獲所有異常(兜底處理)
注意順序:
更具體的異常應(yīng)放在前面,避免被 Exception.class 攔截。
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorResponse handleAllExceptions(Exception ex) {
return new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), "系統(tǒng)內(nèi)部錯誤", ex.getMessage(), LocalDateTime.now());
}
不同返回類型
@ExceptionHandler 方法可以有多種返回類型,如 String, ResponseEntity, Map, 自定義 DTO 等。
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
if (id == null || id <= 0) {
throw new IllegalArgumentException("用戶 ID 不合法");
}
// ...
}
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleIllegalArgument(IllegalArgumentException ex) {
return "參數(shù)錯誤:" + ex.getMessage();
}
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<ErrorResponse> handleUserNotFound(UserNotFoundException ex) {
ErrorResponse error = new ErrorResponse(404, ex.getMessage(), LocalDateTime.now());
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);
}
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorResponse handleAllExceptions(Exception ex) {
return new ErrorResponse(500, "系統(tǒng)錯誤", ex.getMessage(), LocalDateTime.now());
}
}
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何在Spring?Boot微服務(wù)使用ValueOperations操作Redis集群String字符串
這篇文章主要介紹了在Spring?Boot微服務(wù)使用ValueOperations操作Redis集群String字符串類型數(shù)據(jù),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06
groovy腳本定義結(jié)構(gòu)表一鍵生成POJO類
這篇文章主要為大家介紹了groovy腳本定義結(jié)構(gòu)表一鍵生成POJO類示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
SpringBoot+Redis實現(xiàn)接口防刷的示例代碼
在實際開發(fā)中,會出現(xiàn)用戶多次點擊發(fā)送請求,本文主要介紹了SpringBoot+Redis實現(xiàn)接口防刷的示例代碼,具有一定的參考價值,感興趣的可以了解一下2024-01-01
使用Spark?SQL實現(xiàn)讀取不帶表頭的txt文件
這篇文章主要為大家詳細介紹了如何使用Spark?SQL實現(xiàn)讀取不帶表頭的txt文件,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
在Java8與Java7中HashMap源碼實現(xiàn)的對比
這篇文章主要介紹了在Java8與Java7中HashMap源碼實現(xiàn)的對比,內(nèi)容包括HashMap 的原理簡單介紹、結(jié)合源碼在Java7中是如何解決hash沖突的以及優(yōu)缺點,結(jié)合源碼以及在Java8中如何解決hash沖突,balance tree相關(guān)源碼介紹,需要的朋友可以參考借鑒。2017-01-01
J2EE Servlet上傳文件到服務(wù)器并相應(yīng)顯示功能的實現(xiàn)代碼
這篇文章主要介紹了J2EE Servlet上傳文件到服務(wù)器,并相應(yīng)顯示,在文中上傳方式使用的是post不能使用get,具體實例代碼大家參考下本文2018-07-07

