自定义异常处理演示

为了防止黑客从前台异常信息,对系统进行攻击。同时,为了提高用户体验,我们都会都抛出的异常进行拦截处理。

一、全局异常处理

编写一个异常拦截类,如下:@ControllerAdvice,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义,这是一个增强的Controller。使用这个Controller,可以实现三个方面的功能:①、全局异常处理;②、全局数据绑定;③、全局数据预处理;灵活使用这三个功能,可以帮助我们简化很多工作,需要注意的是,这是SpringMVC提供的功能,在 Spring Boot中可以直接使用,下面分别来看。

自定义异常是继承自标准异常类(如ExceptionRuntimeExceptionThrowable)的用户定义的异常类。通过创建自定义异常类,开发者可以自定义异常消息、添加额外的属性和方法,以及更好地组织和处理程序中的异常情况。

Java标准库定义的常用异常包括:

Exception

├─ RuntimeException
│ │
│ ├─ NullPointerException
│ │
│ ├─ IndexOutOfBoundsException
│ │
│ ├─ SecurityException
│ │
│ └─ IllegalArgumentException
│ │
│ └─ NumberFormatException

├─ IOException
│ │
│ ├─ UnsupportedCharsetException
│ │
│ ├─ FileNotFoundException
│ │
│ └─ SocketException

├─ ParseException

├─ GeneralSecurityException

├─ SQLException

└─ TimeoutException

异常: 是程序本身可以处理的异常。也就是我们常见的空指针异常NullPointerException,数组超出范围异常IndexOutOfBoundsException等。

异常分为三种:
【1】检查性异常checked exceptions 编译器要求你必须处置的异常,在编译时可以检查出来。
【2】运行时异常unchecked exceptions 编译器不要求强制处置的异常,往往在运行时才检查出来。
【3】错误: 错误其实不算异常的一种,它是程序中无法处理的错误,它们在编译也检查不到的。

import com.edu.tools.R;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @description:
 * @author: zzx
 * @createDate: 2020/6/2
 * @version: 1.0
 */
@ControllerAdvice
public class GlobalExceptionHandler {
   

    //很重要,括号类制定需要拦截的异常,也可以进行定制化
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public R error(Exception e){
   
        e.printStackTrace();
        //R表示我们给前端返回的接口格式
        return R.error().message("执行全局异常处理。。。");
    }
}

二、全局异常处理测试

[点击并拖拽以移动]

三、自定义异常处理

【1】创建自定义异常类继承RuntimeException类。

/**
 * @description: 自定义异常类,包含了有参合无参构造器
 * @author: zzx
 * @createDate: 2020/6/2
 * @version: 1.0
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BusinessException extends RuntimeException {
   
    private Integer code;//状态码
    private String msg;//异常消息
}

【2】将自定义的异常类添加到拦截的Handler

/**
 * @description:
 * @author: zzx
 * @createDate: 2020/6/2
 * @version: 1.0
 */
@ControllerAdvice
public class GlobalExceptionHandler {
   

    //拦截自定义异常
    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    public R error(BusinessException e){
   
        e.printStackTrace();
        return R.error().code(e.getCode()).message(e.getMsg());
    }
}

【3】在业务代码根据需求进行手动抛出即可,业务代码展示:throw new BusinessException(20001,"手动异常抛出");

/**
 * <p>
 * 讲师 前端控制器
 * </p>
 *
 * @author zhengzhaoxiang
 * @since 2020-06-01
 */
@RestController
@RequestMapping("/eduservice/edu-teacher")
public class EduTeacherController {
   
    @Autowired
    private EduTeacherService eduTeacherService;

    /**
    * @Description 获取所有数据
    * @Author zhengzhaoxiang
    * @Date 2020/6/2 15:27
    * @Param []
    * @Return void
    */
    @GetMapping("findAll")
    public R findAll(){
   

        List<EduTeacher> list = eduTeacherService.list(null);
        try{
   
            int i = 1/0;
        } catch (Exception e){
   
            //手动抛出异常
            throw new BusinessException(20001,"手动异常抛出");
        }

        return R.ok().data("items",list);
    }
}

四、自定义异常处理测试

在这里插入图片描述

五、处理异常

【1】try/catch/finally

try {
   
      可能出现问题的代码;
} catch(异常类名 异常对象) {
   
      异常处理的代码
} finally {
   
    释放未关闭的资源 
}

举个栗子:

try {
   
    res= 1/0;
} catch (Exception e){
   
    System.out.println("计算异常");
    e.printStackTrace();
}

注意:
1、catch必须依赖于try,不能单独使用。
2、catch可以有多个。
3、finally在最后面可写可不写,主要用于释放资源。

【2】throwsthrow:我们有时没有权限或者不应该处理异常,我们可以将异常抛给调用者处理。

[访问权限修饰符] 返回值类型 方法名(参数列表) [throws 异常类名]{
   
方法体;
[return 返回值]; 
}

举个栗子:

//判断是否是三角形方法
public static void isTriangle(int a,int b,int c) throws IllegalArgumentException{
   //抛出一个非法的参数异常try {
   //把可能会出现异常的代码放在try...catch中
            if((a+b>c) && (b+c>a) &&(a+c)>b){
   
                System.out.println(a+"\t"+b+"\t"+c);
            }else {
   
                throw new IllegalArgumentException("不能构成三角形");//新建一个隐式异常的对象
            }
            //System.out.println(i1+"\t"+i2+"t"+i3);
        } catch (Exception e) {
   
            System.out.println("错误");
            e.printStackTrace();//上面Throwable类的成员方法:获取异常类名和异常信息,以及异常出现在程序中的位置
        }
    }

注意:
1、⼀个⽅法可以声明抛出多个异常,即throws后可以跟多个异常(如IllegalArgumentExceptionIOException),多个异常用逗号隔开。
2、throwthrows搭配一般用于自定义异常单独使用throw编译出错,报错信息:java:未报告的异常错误java.lang.Exception

六、总结

如果你希望自定义的异常是受检异常,需要在方法签名中声明或捕获,那么继承自Exception是合适的选择。这样可以明确告诉调用者需要处理该异常。比如处理文件操作时的异常情况。

如果你希望自定义的异常是运行时异常,不需要在方法签名中声明或捕获,那么继承自RuntimeException是更为常见的选择。这样可以让异常的使用更加灵活,不需要在每个方法中显式处理。比如处理数学计算中的非法参数异常。

相关推荐

  1. springboot全局异常处理定义异常处理

    2024-02-20 07:38:02       66 阅读
  2. Springboot定义全局异常处理

    2024-02-20 07:38:02       61 阅读
  3. SpringBoot实现定义异常+全局异常统一处理

    2024-02-20 07:38:02       55 阅读
  4. Spring Security OAuth2 认证服务器定义异常处理

    2024-02-20 07:38:02       59 阅读
  5. 认识异常定义异常

    2024-02-20 07:38:02       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-20 07:38:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-20 07:38:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-20 07:38:02       82 阅读
  4. Python语言-面向对象

    2024-02-20 07:38:02       91 阅读

热门阅读

  1. Centos7.6快速安装mysql8.0不需要验证秘钥完整步骤

    2024-02-20 07:38:02       42 阅读
  2. Spring Cloud Gateway负载均衡

    2024-02-20 07:38:02       38 阅读
  3. vite 和 webpack 的区别

    2024-02-20 07:38:02       56 阅读
  4. 【webpack】基础介绍

    2024-02-20 07:38:02       47 阅读
  5. Webpack和Rollup区别、使用场景、如何选择

    2024-02-20 07:38:02       52 阅读
  6. 【Spring Boot 3】【JPA】一对一单向关联

    2024-02-20 07:38:02       54 阅读
  7. 在Spring Boot中实现类似SPI机制的功能(二)

    2024-02-20 07:38:02       50 阅读
  8. .NET有哪些微服务框架

    2024-02-20 07:38:02       51 阅读
  9. 辽宁政采入驻小知识

    2024-02-20 07:38:02       49 阅读
  10. 【机器学习】是什么?

    2024-02-20 07:38:02       47 阅读
  11. 框架技巧整理

    2024-02-20 07:38:02       50 阅读
  12. npm install 相关过程及分析

    2024-02-20 07:38:02       54 阅读