Java非常处理与全局非常处理全面指南

打印 上一主题 下一主题

主题 1948|帖子 1948|积分 5844

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Java非常处理与全局非常处理全面指南

一、Java非常处理底子

1. 非常分类

Java中的非常分为两大类:


  • Checked Exception(检查型非常):必须被捕获或声明抛出,如IOException、SQLException
  • Unchecked Exception(非检查型非常):RuntimeException及其子类,如NullPointerException、ArrayIndexOutOfBoundsException
2. 基本非常处理语法

  1. try {
  2.     // 可能抛出异常的代码
  3. } catch (SpecificException e) {
  4.     // 处理特定异常
  5. } catch (GeneralException e) {
  6.     // 处理更一般的异常
  7. } finally {
  8.     // 无论是否发生异常都会执行的代码
  9. }
复制代码
3. 非常处理最佳实践


  • 不要忽略非常:空的catch块是"罪过"的
  • 优先处理最具体的非常
  • 合理使用finally开释资源
  • 思量使用try-with-resources(Java 7+)
  • 避免在finally块中使用return
二、Spring全局非常处理机制

1. @ControllerAdvice + @ExceptionHandler

  1. @ControllerAdvice
  2. public class GlobalExceptionHandler {
  3.    
  4.     @ExceptionHandler(Exception.class)
  5.     public ResponseEntity<ErrorResponse> handleAllExceptions(Exception ex) {
  6.         ErrorResponse error = new ErrorResponse(
  7.             "SERVER_ERROR",
  8.             "An unexpected error occurred",
  9.             HttpStatus.INTERNAL_SERVER_ERROR.value()
  10.         );
  11.         return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
  12.     }
  13.    
  14.     @ExceptionHandler(ResourceNotFoundException.class)
  15.     public ResponseEntity<ErrorResponse> handleResourceNotFound(
  16.         ResourceNotFoundException ex) {
  17.         ErrorResponse error = new ErrorResponse(
  18.             "NOT_FOUND",
  19.             ex.getMessage(),
  20.             HttpStatus.NOT_FOUND.value()
  21.         );
  22.         return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
  23.     }
  24. }
复制代码
2. 自界说非常类

  1. public class BusinessException extends RuntimeException {
  2.     private String errorCode;
  3.     private HttpStatus httpStatus;
  4.    
  5.     public BusinessException(String message, String errorCode, HttpStatus httpStatus) {
  6.         super(message);
  7.         this.errorCode = errorCode;
  8.         this.httpStatus = httpStatus;
  9.     }
  10.    
  11.     // getters
  12. }
复制代码
3. 统一响应格式

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class ErrorResponse {
  5.     private String errorCode;
  6.     private String message;
  7.     private int status;
  8.     private long timestamp;
  9.     private String path;
  10.     private List<ValidationError> validationErrors;
  11.    
  12.     public ErrorResponse(String errorCode, String message, int status) {
  13.         this.errorCode = errorCode;
  14.         this.message = message;
  15.         this.status = status;
  16.         this.timestamp = System.currentTimeMillis();
  17.     }
  18. }
  19. @Data
  20. @AllArgsConstructor
  21. public class ValidationError {
  22.     private String field;
  23.     private String message;
  24. }
复制代码
三、高级非常处理本领

1. 处理验证非常(Validation)

  1. @ExceptionHandler(MethodArgumentNotValidException.class)
  2. public ResponseEntity<ErrorResponse> handleValidationExceptions(
  3.     MethodArgumentNotValidException ex) {
  4.    
  5.     List<ValidationError> errors = ex.getBindingResult()
  6.         .getFieldErrors()
  7.         .stream()
  8.         .map(error -> new ValidationError(
  9.             error.getField(),
  10.             error.getDefaultMessage()))
  11.         .collect(Collectors.toList());
  12.    
  13.     ErrorResponse error = new ErrorResponse(
  14.         "VALIDATION_FAILED",
  15.         "Validation failed for one or more fields",
  16.         HttpStatus.BAD_REQUEST.value(),
  17.         errors
  18.     );
  19.    
  20.     return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
  21. }
复制代码
2. 国际化非常消息

  1. @ExceptionHandler(BusinessException.class)
  2. public ResponseEntity<ErrorResponse> handleBusinessException(
  3.     BusinessException ex,
  4.     WebRequest request,
  5.     Locale locale) {
  6.    
  7.     String message = messageSource.getMessage(
  8.         ex.getMessageKey(),
  9.         ex.getArgs(),
  10.         locale);
  11.    
  12.     ErrorResponse error = new ErrorResponse(
  13.         ex.getErrorCode(),
  14.         message,
  15.         ex.getHttpStatus().value()
  16.     );
  17.    
  18.     return new ResponseEntity<>(error, ex.getHttpStatus());
  19. }
复制代码
3. 日记记录策略

  1. @ExceptionHandler(Exception.class)
  2. public ResponseEntity<ErrorResponse> handleAllExceptions(Exception ex, WebRequest request) {
  3.     logger.error("Unexpected error occurred: {}", ex.getMessage(), ex);
  4.    
  5.     ErrorResponse error = new ErrorResponse(
  6.         "SERVER_ERROR",
  7.         "An unexpected error occurred",
  8.         HttpStatus.INTERNAL_SERVER_ERROR.value(),
  9.         request.getDescription(false)
  10.     );
  11.    
  12.     return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
  13. }
复制代码
四、实战建议


  • 分层非常处理

    • 控制器层:处理HTTP干系非常
    • 服务层:处理业务逻辑非常
    • 数据访问层:处理数据干系非常

  • 非常转换:将底层非常转换为上层业务非常
  • 非常信息设计

    • 包含充足的信息用于调试
    • 不袒露敏感信息
    • 提供明确的错误代码

  • 监控与报警:对关键非常设置监控报警
  • 文档化:为API消耗者提供清晰的错误代码和寄义文档
五、常见问题办理方案


  • 处理404错误
  1. @ControllerAdvice
  2. public class CustomErrorController implements ErrorController {
  3.    
  4.     @RequestMapping("/error")
  5.     public ResponseEntity<ErrorResponse> handleError(HttpServletRequest request) {
  6.         Integer status = (Integer) request.getAttribute("javax.servlet.error.status_code");
  7.         Exception exception = (Exception) request.getAttribute("javax.servlet.error.exception");
  8.         
  9.         ErrorResponse error = new ErrorResponse(
  10.             "NOT_FOUND",
  11.             "Requested resource not found",
  12.             status
  13.         );
  14.         
  15.         return new ResponseEntity<>(error, HttpStatus.valueOf(status));
  16.     }
  17. }
复制代码

  • 处理跨域非常
  1. @ExceptionHandler
  2. public ResponseEntity<ErrorResponse> handleCorsException(CorsException ex) {
  3.     ErrorResponse error = new ErrorResponse(
  4.         "CORS_ERROR",
  5.         ex.getMessage(),
  6.         HttpStatus.FORBIDDEN.value()
  7.     );
  8.     return new ResponseEntity<>(error, HttpStatus.FORBIDDEN);
  9. }
复制代码

  • 处理文件上传大小限制非常
  1. @ExceptionHandler(MaxUploadSizeExceededException.class)
  2. public ResponseEntity<ErrorResponse> handleMaxSizeException(
  3.     MaxUploadSizeExceededException exc) {
  4.    
  5.     ErrorResponse error = new ErrorResponse(
  6.         "FILE_TOO_LARGE",
  7.         "File size exceeds the allowed limit",
  8.         HttpStatus.BAD_REQUEST.value()
  9.     );
  10.    
  11.     return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
  12. }
复制代码
六、总结

精良的非常处理是构建结实Java应用步伐的关键。通过合理使用Java原生非常机制和Spring的全局非常处理功能,可以:

  • 进步代码的结实性和可维护性
  • 提供一致的用户体验
  • 便于问题排查和调试
  • 实现更好的系统监控
记着:非常处理的目标不是消灭所有非常,而是以可控的方式处理非常,并提供有意义的反馈。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表