Home Tags Posts tagged with "Error"

Error

0 62

为了优化Springboot项目的全局异常处理,回顾了一下异常知识,特此记录

 

首先了解一下异常体系结构

那么什么是异常呢?

出现场景:我们编写的模块让用户输入数字,而用户却输入了字符,我们的程序要打开某个文档,但这个文档却不存在或者格式不对,读取数据库的数据,数据可能是空的,网络连接失败,非法参数等;这些异常发生在程序运行期间,它影响了正常的程序执行流程;

这些场景我们称之为异常(Exception)

为什么要处理异常?

为了使程序对异常做出合理的处理,不让程序崩溃或无法运行;

 

异常分类:

1.检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,程序员无法预见。例如要打开一个不存在的文件时,一个异常就发生了,这些异常在编译时不能被简单的忽略;

2.运行时异常:运行时异常是可能被程序员避免的异常,与检查性异常相反,运行时异常可以在编译时被忽略;

错误(Error):错误不是异常,而是脱离程序员控制的问题,非常严重,错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到;

Exception

 

 

异常处理机制

五大关键字:

try:尝试去处理某代码块

catch:捕获try中代码块出现的异常

finally:一定会执行(可用于关闭资源)

throw、throws:抛出异常

 

1.制造异常

2.捕获异常输出信息

3.接下来我们更改上述异常为错误,观察ArithmeticException这个异常类能不能捕获Error

4.由异常体系图可知,Error和Exception都是Throwable类的子类,那么Throwable是否可以捕获Error呢?

可知:catch()里面的参数为想要捕获的异常类型,Throwable最高级

5.Java支持多catch捕获(从小到大),但是需要注意,子类异常在上父类异常在下才可以,如果父类异常在上那么子类异常catch就不起作用了,因为父类先捕获了异常
补充:

IDEA添加Try()catch()快捷键:ctrl+alt+t

e.printStackTrace();打印错误的栈信息

异常抛出:

@Test
void Exception02(){

   try {
      test(1,0);
   } catch (ArithmeticException e) {
      e.printStackTrace();
   }
}
//假设这个方法处理不了异常,则方法抛出异常
public void test(int a, int b)throws ArithmeticException{
   if(b == 0)throw new ArithmeticException();//主动抛出异常,一般在方法中使用
}

算数异常属于运行时异常,不需要我们程序抛出,Java会自己抛出,如果不用try()catch()程序会停止,但如果我们用了,程序就会继续往下运行;

 

实战:自定义异常

使用Java内置的异常类可以描述编程时出现的大部分异常情况,除此之外,用户还可以自定义异常。用户自定义异常类,只需要继承Exception类即可

步骤:

1.创建自定义异常类

2.在方法中通过throw关键字抛出异常对象

3.如果在当前抛出异常的方法中处理异常,使用Try-catch语句捕获并处理;否则在方法的声明处使用throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作

4.在出现一场方法的调用者中捕获并处理异常

 

代码:

package Exception;


/**自定义异常类
 *1.自定义异常类,继承Exception
 *2.处理可能出现的异常问题
 *3.输出异常信息
 *
 */
public class MyException extends Exception{


    //传递数字>10则抛出异常
    private int detail;

    public MyException(int detaild) {
        this.detail = detail;
    }


    //异常的打印信息
    @Override
    public String toString() {
        return "你好,MyException{" +
                "detail=" + detail +
                '}';
    }
}
public class Test {

    //可能存在异常的方法,通过throws进行抛出,try-catch则为捕获
   static public void test(int a) throws MyException {
        System.out.println("传递的参数为:"+a);
        if(a>10)throw new MyException(a);//抛出,使外面调用者捕获
       System.out.println("Ok");
   }

    public static void main(String[] args) {
        try {
            test(11);
        } catch (MyException e) {
            System.out.println("MyException->"+e);
        }
    }
}

使用经常总结: