一.定义全局异常处理器
操作步骤:
1.创建一个类,加上@ControllerAdvice注解
2.在该类中定义一个方法,参数为Exception e,并给方法加上@ExceptionHandler(Exception.class)注解
3.方法中写两行代码,e.printStackTrace(); 和你要在控制台上输出的错误信息
一个简单的全局异常处理器就定义好了,下图为一个示例,因为我要将方法的返回值直接作为 HTTP 响应体返回给客户端,所以我通过 @ResponseBody
将Result对象序列化为 JSON 格式传递给前端。
详解:
1.@ControllerAdvice
是 Spring 提供的注解,表示这是一个全局的异常处理类。它可以用来捕获所有控制器(即标有 @Controller
或 @RestController
的类)中发生的异常,并进行统一的异常处理。
2.@ExceptionHandler(Exception.class)
:这个注解标识的方法用于处理指定类型的异常。在这里,Exception.class
表示处理所有类型的异常。当控制器抛出 Exception
类型的异常时,这个方法会被调用。
3.e.printStackTrace()
:打印异常的堆栈信息。
4.return语句用来在捕获到异常后输出你想输出的内容,上图的Result是我自己编写的统一结果响应类,大家可以按照需要自行编写
二.定义自定义异常处理器
操作步骤1:
先创建一个自定义异常,具体为创建一个类,继承RuntimeException,添加你需要的自定义信息(如状态码、错误消息等)。
下图为一个自定义异常的示例
这个类中,我写了一个构造方法,允许传入一个错误码 code
和一个错误消息 msg
,用于创建异常对象。super(msg)
:调用父类 RuntimeException
的构造方法,将异常消息传递给它。这样可以使用 getMessage()
方法来获取错误消息。然后将传入的 code
和 msg
赋值给当前对象的成员变量。最终我对toString()
方法进行了重写这样就可以使用this.getMessage()
获取父类中的异常消息。
操作步骤2:
自定义异常后,还需要自定义一个异常处理器,方法和定义之前的全局异常处理器类似,下图为一个示例:
使用@ExceptionHandler(MyException.class)
这个注解告诉 Spring,这个方法专门用来处理 MyException
类型的异常。
方法的参数也必须改为自定义的异常 MyException类型
。
这里的Result是我创建的一个统一结果响应类,使用它可以让我自定义返回的状态码和响应信息,大家可以根据需要自行修改
。
三.注意事项
RuntimeException
是 Exception
的子类,它也是一种 Exception
。
但Exception
类是所有受检异常的基类。受检异常必须显式地捕获或声明抛出。例如,如果你抛出一个 IOException
编译器会强制要求你用 try-catch
来捕获,或者在方法签名上声明 throws
。
RuntimeException
是一种未检查异常。这类异常在编译时不强制处理,也不需要显式声明 throws
,直接抛出即可。