写下此篇记录平时的学习中觉得有用的东西,同时希望用我自己理解的直白一点的话来使你理解。
为什么要进行统一异常处理。
举个简单的例子,如果一个程序中有这么一段代码
System.out.println(10/0);
这会导致什么,服务器报500,导致下面的代码都不能运行。而且在开发中,有异常是很正常的情况,那我们怎么处理它呢,不可能说我们给每个代码都去try catch吧,这是不现实的,所以该怎么发现异常并且有效处理它是很重要的。所以这个时候我们就要进行统一异常处理。
我这里代码的话就简单写一下,处理所有的Exception,当然你也可以自己去定义一些异常。
这里我先给出代码再慢慢解释知识点。
DefaultException类:
import com.fzy.vo.ResultJson;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class DefaultException {
@ExceptionHandler
public ResultJson handler(Exception ex){
//必须将异常信息打印到控制台上
//给系统管理员看的信息(开发者)
ex.printStackTrace();
//给用户返回的错误信息
return ResultJson.failed("系统异常,请联系管理员");
}
}
解释:
@RestControllerAdvice 作用于所有的controller控制器上 找到所有的@RequestMapping注解的类的所有方法上 @RestControllerAdvice一般都会搭配@ExceptionHandler注解 做controller的全局异常处理使用 说白了这里的@RestControllerAdvice的作用就是找所有的controller的方法 @ExceptionHandler 是做全局异常处理
说白了其实就是你Controller里的方法出问题了,就是到这个 @RestControllerAdvice注解的类里面,这时候出问题肯定是要抛异常的吧,抛出的异常给谁呢,就是@ExceptionHandler注解的方法上,而这个@ExceptionHandler后面可以加括号,括号里面的内容就是你要处理的异常的类,我这里没加默认就是所有异常。 比如可以这样用@ExceptionHandler(Exception.class)。
这里大家思考一下:为什么我们要捕捉Controller里的方法出的异常呢,为什么不是Service,Mapper呢?
其实很简单,因为Controller是最高层,我们可以想一下,持久层(Mapper层)出问题了是不是要往业务层(Service层)抛,业务层出问题了是不是要往Controller层抛,而Controller对于我们开发者来讲就是最后一层,所以我们只需处理Controller就可以了。
//必须将异常信息打印到控制台上 //给系统管理员看的信息(开发者) ex.printStackTrace();
这应该好理解吧,不解释了这里就。
//给用户返回的错误信息 return ResultJson.failed("系统异常,请联系管理员");
这里是给用户返回的消息。
OK,这部分内容就写到这里了,希望对你有所帮助。