legs+ 发表于 2023-10-12 09:42:18

Java异常处理:

Java使用异常提供了一个一致的错误报告模型,从而使组件可以将问题可靠地传达给客户代码。

在Java中,异常处理的目标是减少当前的代码量,从而使创建大型、可靠的程序更简单易行,并且这样也使我们更加确信,应用程序不会存在未处理的错误。异常不是特别难学,而且可以为我们的项目提供直接和显著的好处。
因为异常处理是Java报告错误的唯一的方式,而且是由Java编译器强制实行的,所以如果不学好异常处理,你的Java学习之路也就到此为止了。

孤星3 发表于 2023-10-12 17:00:35

这里的异常是不是叫做exception?

legs+ 发表于 2023-10-12 18:32:39

1 异常体系的最上层是Throwable类
子类有Error和Exception
Exception的子类又有RuntimeException和其他具体的可检查异常。

2 Error是jvm完全无法处理的系统错误,只能终止运行。

运行时异常指的是编译正确但运行错误的异常,如数组越界异常,一般是人为失误导致的,这种异常不用try catch,而是需要程序员自己检查。

可检查异常一般是jvm处理不了的一些异常,但是又经常会发生,比如Ioexception,Sqlexception等,是外部实现带来的异常。

3 多线程的异常流程是独立的,互不影响。
大型模块的子模块异常一般需要重新封装成外部异常再次抛出,否则只能看到最外层异常信息,难以进行调试。

legs+ 发表于 2023-10-12 18:33:41

我手头有个关于异常的脑图,我一时半会没找到,下次在此贴分享给大家。

legs+ 发表于 2023-10-12 19:42:55


legs+ 发表于 2023-10-12 19:47:15

Java 的强类型机制、异常处理、垃圾回收机制等都是 Java 健壮性的重要保证。对指针的丢弃是 Java 的一大进步。另外,Java 的异常机制也是健壮性的一大体现。

孤星3 发表于 2023-10-12 20:18:32

legs+ 发表于 2023-10-12 19:42


哇,精辟,其他语言也是这样的吗? 看来应该只是指Java.

legs+ 发表于 2023-10-12 20:27:09

@RestController
/*springboot提供了默认的错误映射地址error
@RequestMapping("${server.error.path:${error.path:/error}}")
@RequestMapping("/error")
上面2种写法都可以
*/
@RequestMapping("/error")
//继承springboot提供的ErrorController
public class TestErrorController implements ErrorController {
    //一定要重写方法,默认返回null就可以,不然报错,因为getErrorPath为空.
    @Override
    public String getErrorPath() {
      return null;
    }

    //一定要添加url映射,指向error
/*    @RequestMapping()
    public Map<String, Object> handleError() {
      //用Map容器返回信息
      Map<String, Object> map = new HashMap<String, Object>();
      map.put("code", 404);
      map.put("msg", "不存在");
      return map;
    }*/

    /*这里加一个能正常访问的页面,作为比较
    因为写在一个控制器所以它的访问路径是
    http://localhost:8080/error/ok*/
    @RequestMapping("/ok")
    @ResponseBody
    public Map<String, Object> noError() {
      //用Map容器返回信息
      Map<String, Object> map = new HashMap<String, Object>();
      map.put("code ", 200);
      map.put("msg", "正常,这是测试页面");

      return map;
    }

//这里不要加consumes="text/html;charset=UTF-8",不然不成功,有部分浏览器提交的是空值
    @RequestMapping( value = "",produces = "text/html;charset=UTF-8")
    @ResponseBody
    public String errorHtml4040(HttpServletRequest request, HttpServletResponse response) {
      //跳转到error 目录下的 404模板
      return "404错误,不存在";
    }
    @RequestMapping(value = "", consumes="application/json;charset=UTF-8",produces = "application/json;charset=UTF-8")
    @ResponseBody
    publicMap<String, Object> errorJson() {
      //用Map容器返回信息
      Map<String, Object> map = new HashMap<String, Object>();
      map.put("rspCode", 404);
      map.put("rspMsg", "不存在");
      return map;
    }


}@RestControllerAdvice
public class GlobalExceptionHandler {
    // 日志记录工具
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
   * 400 - Bad Request
   */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MissingServletRequestParameterException.class)
    public Map<String, Object> handleMissingServletRequestParameterException(MissingServletRequestParameterException e) {
      logger.error("缺少请求参数", e);
      Map<String, Object> map = new HashMap<String, Object>();
      map.put("rspCode", 400);
      map.put("rspMsg", e.getMessage());
      //发生异常进行日志记录,写入数据库或者其他处理,此处省略
      return map;
    }

    /**
   * 400 - Bad Request
   */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(HttpMessageNotReadableException.class)
    public Map<String, Object> handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
      logger.error("参数解析失败", e);
      Map<String, Object> map = new HashMap<String, Object>();
      map.put("rspCode", 400);
      map.put("rspMsg", e.getMessage());
      //发生异常进行日志记录,写入数据库或者其他处理,此处省略
      return map;
    }
    /**
   * 400 - Bad Request
   */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Map<String, Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
      logger.error("参数验证失败", e);
      BindingResult result = e.getBindingResult();
      FieldError error = result.getFieldError();
      String field = error.getField();
      String code = error.getDefaultMessage();
      String message = String.format("%s:%s", field, code);
      Map<String, Object> map = new HashMap<String, Object>();
      map.put("rspCode", 400);
      map.put("rspMsg", message);
      //发生异常进行日志记录,写入数据库或者其他处理,此处省略
      return map;
    }

    /**
   * 400 - Bad Request
   */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(BindException.class)
    public Map<String, Object> handleBindException(BindException e) {
      logger.error("参数绑定失败", e);
      Map<String, Object> map = new HashMap<String, Object>();
      BindingResult result = e.getBindingResult();
      FieldError error = result.getFieldError();
      String field = error.getField();
      String code = error.getDefaultMessage();
      String message =String.format("%s:%s", field, code);
      map.put("rspCode", 400);
      map.put("rspMsg",message);
      //发生异常进行日志记录,写入数据库或者其他处理,此处省略
      return map;
    }


    /**
   * 400 - Bad Request
   */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(ConstraintViolationException.class)
    public Map<String, Object> handleServiceException(ConstraintViolationException e) {
      logger.error("参数验证失败", e);
      Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
      ConstraintViolation<?> violation = violations.iterator().next();
      String message = violation.getMessage();
      Map<String, Object> map = new HashMap<String, Object>();
      map.put("rspCode", 400);
      map.put("rspMsg", message);
      //发生异常进行日志记录,写入数据库或者其他处理,此处省略
      return map;
    }
    /**
   * 400 - Bad Request
   */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(ValidationException.class)
    public Map<String, Object> handleValidationException(ValidationException e) {
      logger.error("参数验证失败", e);
      Map<String, Object> map = new HashMap<String, Object>();
      map.put("rspCode", 400);
      map.put("rspMsg", e.getMessage());
      //发生异常进行日志记录,写入数据库或者其他处理,此处省略
      return map;
    }

    /**
   * 405 - Method Not Allowed
   */
    @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public Map<String, Object> handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
      logger.error("不支持当前请求方法", e);
      Map<String, Object> map = new HashMap<String, Object>();
      map.put("rspCode", 405);
      map.put("rspMsg", e.getMessage());
      //发生异常进行日志记录,写入数据库或者其他处理,此处省略
      return map;
    }

    /**
   * 415 - Unsupported Media Type
   */
    @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
    @ExceptionHandler(HttpMediaTypeNotSupportedException.class)
    public Map<String, Object> handleHttpMediaTypeNotSupportedException(HttpMediaTypeNotSupportedException e) {
      logger.error("不支持当前媒体类型", e);
      Map<String, Object> map = new HashMap<String, Object>();
      map.put("rspCode", 415);
      map.put("rspMsg", e.getMessage());
      //发生异常进行日志记录,写入数据库或者其他处理,此处省略
      return map;
    }

    /**
   * 自定义异常类
   */
    @ResponseBody
    @ExceptionHandler(BusinessException.class)
    public Map<String, Object> businessExceptionHandler(BusinessException e) {
      logger.error("自定义业务失败", e);
      Map<String, Object> map = new HashMap<String, Object>();
      map.put("rspCode", e.getCode());
      map.put("rspMsg", e.getMessage());
      //发生异常进行日志记录,写入数据库或者其他处理,此处省略
      return map;
    }


    /**
   * 获取其它异常。包括500
   *
   * @param e
   * @return
   * @throws Exception
   */
    @ExceptionHandler(value = Exception.class)
    public Map<String, Object> defaultErrorHandler(Exception e) {
      logger.error("Exception", e);
      Map<String, Object> map = new HashMap<String, Object>();
      map.put("rspCode", 500);
      map.put("rspMsg", e.getMessage());
      //发生异常进行日志记录,写入数据库或者其他处理,此处省略
      return map;
    }
}
Java其实迭代很快,从JDK 8以后发展的更快了
c#我不知道,.net core应该有吧
页: [1]
查看完整版本: Java异常处理: