zoukankan      html  css  js  c++  java
  • Exception异常处理

    编译期异常:写代码时候变为红色,可能会产生异常,需要处理才能执行,一般情况下, API 中写了 throws 的 Exception 都不是 RuntimeException 。

      第一种方法,把异常抛出去 方法上 throws ,交给虚拟机来处理,当不匹配的时候,虚拟机就会将异常打印出来,终止程序。

      第二种方法,不终止程序,用 try { } catch ()  { } 来处理异常,把异常打印在控制台,程序继续执行 ,以上是编译期异常。

    还有运行期异常,运行时异常继承 RuntimeException ,是非受检异常,如 NullPointerException、IndexOutOfBoundsException 等,抛出运行时异常,可不处理默认交给 jvm 。

    由于这类异常要么是系统异常,无法处理,如网络问题;要么是程序逻辑错误,如空指针异常; JVM 必须停止运行以改正这种错误,所以运行时异常可以不进行处理,不需要捕获或向上抛出,

    当然也可以处理,使用 try{ } catch() { } 处理,将异常打印到控制台,后续代码继续执行,一般建议 runtimeException 也进行 try...catch 处理

      工作中必须对传递的参数做合法的校验,如果参数不合法,我们必须使用抛出异常的方式,告知方法的调用者,传递的参数有问题,最终交给 jvm ,

      自定义异常:告诉用户请求有问题,出异常的时候返回一个 code 给前端,如果不进行自定义异常,前后端分离的时候,后端出异常,显示给前端的页面会很不友好

      public ValidException extends RuntimeException {  // 最顶级的运行异常

        private Integer code;
        private String msg;

        public ValidException(int code,String msg) {
        super(msg);
        this.code = code;
        this.msg = msg;
        }
      }

      还需要写一个 Handler 全局的: 拦截相应的异常类

      @ControllerAdvice
      public class ValidExceptionHandler {
        @ExceptionHandler(value = Exception.class) //处理 Exception ,如果出现了该异常,就会拦截进行相应的处理,如果改成 ValidException ,则处理 ValidException 这个类
        @ResponseBody //响应数据给前端
        public JsonData Handler(Exception e) {
          if(e instanceof ValidException) {
            ValidException validException = (ValidException) e;
            return JsonData.buildError(validException.getMsg(), validException .getCode());
          } else {
            return JsonData.buildError("全局异常,位置错误");  //在 JsonData 里面有设置错误码 code = -1
          }
        }
      }

    异常抛出的时候,如果和自定义里面的异常处理能对应上,就会进行对应的处理,而 catch 会捕获异常做些处理,打印或者也抛出,能 catch 到的异常 ArithmeticException ,RuntimeException , Exception

    @Transactional 注解:

      运行时异常如果不进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止,如果不想终止,则必须捕获所有的运行时异常
      队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理

      非运行时异常是 RuntimeException 以外的异常,类型上都属于 Exception 类及其子类。如 IOException 、 SQLException 等以及用户自定义的 Exception 异常。面对这种异常,只能自己去写一大堆 catch 块去处理可能的异常。

      声明式事务管理也有两种常用的方式,一种是基于 tx 和 aop 名字空间的 xml 配置文件,另一种就是基于 @Transactional 注解。显然基于注解的方式更简单易用,更清爽。

      当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。
      在项目中,@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。

      在 @Transactional 注解中如果不配置 rollbackFor 属性,那么事物只会在遇到 RuntimeException 的时候才会回滚,加上 rollbackFor = Exception.class ,可以让事物在遇到非运行时异常时也回滚

  • 相关阅读:
    六十三:CSRF攻击与防御之系统准备之登录与转账功能
    六十二:CSRF攻击与防御之系统准备之注册功能
    六十一:Flask.Session之flask操作session
    并发编程之多进程篇之二
    并发编程之多进程篇之一
    网络编程之文件传输实例
    网络编程基础之粘包现象与UDP协议
    网络编程基础之Socket套接字简单应用
    TCP协议的三次握手和四次挥手
    网络编程基础之Socket套接字
  • 原文地址:https://www.cnblogs.com/moxiaodan/p/14030423.html
Copyright © 2011-2022 走看看