Java异常处理:

legs+之专栏 legs+之专栏 1215 人阅读 | 7 人回复 | 2023-10-12

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

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

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

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

回答|共 7 个

孤星3 发表于 2023-10-12 17:00:35| 字数 20 来自手机 | 显示全部楼层

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

legs+ 发表于 2023-10-12 18:32:39| 字数 313 | 显示全部楼层

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

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

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

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

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

legs+ 发表于 2023-10-12 18:33:41| 字数 33 | 显示全部楼层

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

legs+ 发表于 2023-10-12 19:42:55| 字数 0 | 显示全部楼层

68747470733a2f2f67697465652e636f6d2f67736a7177796c2f696d616765732f7261772f6d6173.jpg

legs+ 发表于 2023-10-12 19:47:15| 字数 78 | 显示全部楼层

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

孤星3 发表于 2023-10-12 20:18:32| 字数 51 来自手机 | 显示全部楼层

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


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

legs+ 发表于 2023-10-12 20:27:09| 字数 6,508 | 显示全部楼层

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

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

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

  34.         return map;
  35.     }

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


  52. }
复制代码
  1. @RestControllerAdvice
  2. public class GlobalExceptionHandler {
  3.     // 日志记录工具
  4.     private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

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

  18.     /**
  19.      * 400 - Bad Request
  20.      */
  21.     @ResponseStatus(HttpStatus.BAD_REQUEST)
  22.     @ExceptionHandler(HttpMessageNotReadableException.class)
  23.     public Map<String, Object> handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
  24.         logger.error("参数解析失败", e);
  25.         Map<String, Object> map = new HashMap<String, Object>();
  26.         map.put("rspCode", 400);
  27.         map.put("rspMsg", e.getMessage());
  28.         //发生异常进行日志记录,写入数据库或者其他处理,此处省略
  29.         return map;
  30.     }
  31.     /**
  32.      * 400 - Bad Request
  33.      */
  34.     @ResponseStatus(HttpStatus.BAD_REQUEST)
  35.     @ExceptionHandler(MethodArgumentNotValidException.class)
  36.     public Map<String, Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
  37.         logger.error("参数验证失败", e);
  38.         BindingResult result = e.getBindingResult();
  39.         FieldError error = result.getFieldError();
  40.         String field = error.getField();
  41.         String code = error.getDefaultMessage();
  42.         String message = String.format("%s:%s", field, code);
  43.         Map<String, Object> map = new HashMap<String, Object>();
  44.         map.put("rspCode", 400);
  45.         map.put("rspMsg", message);
  46.         //发生异常进行日志记录,写入数据库或者其他处理,此处省略
  47.         return map;
  48.     }

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


  67.     /**
  68.      * 400 - Bad Request
  69.      */
  70.     @ResponseStatus(HttpStatus.BAD_REQUEST)
  71.     @ExceptionHandler(ConstraintViolationException.class)
  72.     public Map<String, Object> handleServiceException(ConstraintViolationException e) {
  73.         logger.error("参数验证失败", e);
  74.         Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
  75.         ConstraintViolation<?> violation = violations.iterator().next();
  76.         String message = violation.getMessage();
  77.         Map<String, Object> map = new HashMap<String, Object>();
  78.         map.put("rspCode", 400);
  79.         map.put("rspMsg", message);
  80.         //发生异常进行日志记录,写入数据库或者其他处理,此处省略
  81.         return map;
  82.     }
  83.     /**
  84.      * 400 - Bad Request
  85.      */
  86.     @ResponseStatus(HttpStatus.BAD_REQUEST)
  87.     @ExceptionHandler(ValidationException.class)
  88.     public Map<String, Object> handleValidationException(ValidationException e) {
  89.         logger.error("参数验证失败", e);
  90.         Map<String, Object> map = new HashMap<String, Object>();
  91.         map.put("rspCode", 400);
  92.         map.put("rspMsg", e.getMessage());
  93.         //发生异常进行日志记录,写入数据库或者其他处理,此处省略
  94.         return map;
  95.     }

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

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

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


  135.     /**
  136.      * 获取其它异常。包括500
  137.      *
  138.      * @param e
  139.      * @return
  140.      * @throws Exception
  141.      */
  142.     @ExceptionHandler(value = Exception.class)
  143.     public Map<String, Object> defaultErrorHandler(Exception e) {
  144.         logger.error("Exception", e);
  145.         Map<String, Object> map = new HashMap<String, Object>();
  146.         map.put("rspCode", 500);
  147.         map.put("rspMsg", e.getMessage());
  148.         //发生异常进行日志记录,写入数据库或者其他处理,此处省略
  149.         return map;
  150.     }
  151. }
复制代码

Java其实迭代很快,从JDK 8以后发展的更快了
c#我不知道,.net core应该有吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则