在Spring-MVC项目中,即使没有传统的if-else
语句,也可以通过多种方式优雅地处理错误。以下是一些常见的方法和它们的优势、类型、应用场景以及示例代码:
@ControllerAdvice
注解允许你定义全局异常处理类,而@ExceptionHandler
注解则用于处理特定类型的异常。
优势:
应用场景:
示例代码:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleException(Exception ex) {
ErrorResponse errorResponse = new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(NotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFoundException(NotFoundException ex) {
ErrorResponse errorResponse = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);
}
}
通过实现ErrorController
接口,可以自定义错误页面或错误响应。
优势:
应用场景:
示例代码:
@Controller
public class CustomErrorController implements ErrorController {
@RequestMapping("/error")
public ResponseEntity<ErrorResponse> handleError(HttpServletRequest request) {
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
Exception exception = (Exception) request.getAttribute("javax.servlet.error.exception");
String errorMessage = exception != null ? exception.getMessage() : "Unknown error";
ErrorResponse errorResponse = new ErrorResponse(statusCode, errorMessage);
return new ResponseEntity<>(errorResponse, HttpStatus.valueOf(statusCode));
}
public String getErrorPath() {
return "/error";
}
}
通过面向切面编程(AOP),可以在方法调用前后插入异常处理逻辑。
优势:
应用场景:
示例代码:
@Aspect
@Component
public class ExceptionHandlingAspect {
@AfterThrowing(pointcut = "execution(* com.example.controller.*.*(..))", throwing = "ex")
public void handleException(Exception ex) {
// 记录日志或进行其他处理
System.err.println("Exception occurred: " + ex.getMessage());
}
}
在服务层或控制器层使用一个统一的Result
对象来封装返回值和错误信息。
优势:
应用场景:
示例代码:
public class Result<T> {
private int code;
private String message;
private T data;
// 构造函数、getter和setter省略
}
@Controller
public class ExampleController {
@GetMapping("/example")
public Result<String> example() {
try {
// 业务逻辑
return new Result<>(200, "Success", "Some data");
} catch (Exception e) {
return new Result<>(500, e.getMessage(), null);
}
}
}
通过这些方法,可以在Spring-MVC项目中有效地处理错误,而不必依赖传统的if-else
语句。每种方法都有其特定的应用场景和优势,可以根据具体需求选择合适的方式。
领取专属 10元无门槛券
手把手带您无忧上云