学习目标
java中的异常和错误
学习内容
- 首页要了解什么是异常什么是错误
- 捕捉全局异常
- 自定义异常
java中异常和错误的区别
error类和exception类的父类都是throwable类: 他们的区别是:
- error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。
- exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
常见的异常 :
- arrayindexoutofboundsexception 数组下标越界异常,
- arithmaticexception 算数异常 如除数为零
- nullpointerexception 空指针异常
- illegalargumentexception 不合法参数异常
直接上代码
public class exception {
public static void main(string[] args) {
exception01();
}
public static void exception01(){
int i =1/0;
}
}
结果是:算数异常,如果直接让用户看见异常信息不友好

改造一下写法:把异常捕获,这样就不会看见异常信息,这里写的有些问题 不应该写execption,这个异常都所有异常的父类,应该写对应的异常,算数异常是 arithmeticexecption

真正的项目里发生异常该怎么捕获呢?下面就来了解一下全局异常,创建springboot项目
1.创建一个controller包,里面写了一个异常方法,
2.配置swagger-ui来进行接口的访问
@getmapping("exception")
public r exception(){
throw new runtimeexception("运行异常");
}
结果肯定是报错,但是这个异常是可以人工干预的,避免控制台输出报错信息,或者把报错解释的详细一点

创建一个myexceptionhandler类,这个类就是来帮我们捕获全局异常的类,
1.在这个类上加上@restcontrolleradvice注解
2.创建一个方法
3.在方法上加上@exceptionhandler注解中可以添加参数,参数是某个异常类的class,代表这个方法 专门处理该类异常,比如这样:,
@restcontrolleradvice
@slf4j
public class myexceptionhandler {
@exceptionhandler(value = exception.class)
public string exceptionhandler(exception e){
log.error("未知异常!原因是:"+e.getmessage());
return "未知错误!!!";
}
}
继续访问异常的接口,没有报错了,返回的结果也我定义的数据

控制台也输出异常信息

到这异常的捕获就完成了,但是我们捕获都是系统自带的异常,我就在想能不能自定义异常,然后进行捕获,开干
实现步骤:
- 创建一个枚举进行异常传递
- 创建一个自定义的异常类取名叫customexception,
- 在myexceptionhandler全局异常中把自定义异常捕获
枚举
@getter
@allargsconstructor
public enum rcode {
success(0,"操作成功!"),
fail(1,"操作失败!"),
auth_error(40411,"用户名或密码不存在!"),
no_auth_error(40412,"无权访问!"),
sys_valid_error(501,"参数校验错误"),
sys_exception(2,"模拟异常"),
invalid_token(40410,"token无效,您无权访问该接口"),
;
private integer code;
private string msg;
}
customexception类
@getter
public class customexception extends runtimeexception{
private rcode rcode;
public customexception(rcode rcode) {
this.rcode = rcode;
}
public customexception(throwable cause, rcode rcode) {
super(cause);
this.rcode = rcode;
}
}
在全局异常类中捕获
@restcontrolleradvice
@slf4j
public class myexceptionhandler {
//捕获自定义异常
@exceptionhandler(value = customexception.class)
public r customerexceptionhandler(customexception e){
log.error("未知异常!原因是:"+e.getrcode().getmsg());
return r.error(e.getrcode());
}
}
进行测试:首页修改controller中接口抛出的异常 换成我们自己定义的异常类

进行测试:结果

控制台:

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论