Java异常、处理异常、继承结构、自定义异常、SpringBoot中全局捕获处理异常

Java异常

首先程序错误分为三种:

继承结构



首先异常的父类是 Throwable ,然后两个子类, ErrorException 。其中Error(错误)是JVM中系统的异常,这些错误是不可控的,一般程序出现死循环或者线程死锁之类会导致出现此类错误。

然后 Exception 中又分为两大类:运行时异常( RuntimeException )、非运行时异常( IO异常、SQL异常 等)。 运行时异常 这种系统异常可以处理也可以不处理,所以编译器不强制用try…catch处理或用throws声明。

但是非运行时异常(又称编译异常),如IOException等,这种异常必须要显式的解决或抛出,要么自己try-catch解决,要么把异常抛出去交给jvm来解决,无论如何必须要处理这种异常。 编译器会强制让我们进行处理的

那么可以得知:首先 Error中的错误 是我们无法手动处理的,只能通过优化代码等方式调整,然后 Exception中的RuntimeException 是可以不进行try-catch或throws处理的,那么某一层面上可以说这两种错误是 非受查异常 ,也就是编译器不会进行检查的异常。

Exception中的IOException等 是编译器一定会进行检查且必须让我们手动处理(解决异常或抛出异常给jvm)被称之为 受查异常

如何处理异常

运行时异常(系统异常) 不需要预处理,通过规范的代码可以避免产生这种异常

受检异常(编译时异常) 必须预处理,否则编译报错,有两种处理方式 :

处理异常

try {
 

} catch (OneException e) {
 

} catch (TwoException e) {
 

} finally {
 

}
·try中包含了可能产生异常的代码
·try后面是catch,catch可以有一个或多个,catch中是需要捕获的异常
·当try中的代码出现异常时,出现异常下面的代码不会执行,马上会跳转到相应的catch语句块中,如果没有异常不会跳转到catch中
·finally表示,不管是出现异常,还是没有出现异常,finally里的代码都执行,finally和catch可以分开使用,但finally必须和try一块使用
·而且要注意:假如有多个异常需要进行捕获,异常的捕获顺序是 先子类后父类 的,如下:

try {
 

} catch (ChildException e) {
 

} catch (ParentException e) {
 

} finally {
 

}
抛出异常
在定义方法时,如果方法体中有受检(编译时)异常需要预处理, 可以捕获处理 , 也可以抛出处理 。

处理异常时,使用 throws 抛出处理:

谁调用这个方法,谁负责处理该异常
在定义方法时,把异常抛出就是为了提醒方法的使用者,有异常需要预处理
在处理异常时,是选择捕获处理还是抛出处理

一般情况下,在调用其他方法时,如果被调用的方法有受检(编译时)异常需要预处理,选择捕获处理,因为你调用了方法, 你负责处理该异常。
在定义方法时,如果方法体中有受检异常需要预处理,可以选择捕获 ,也可以选择抛出处理。如果方法体中通过throw语句抛出了一个异常对象,所在的方法
// 声明方法时抛出异常,并且声明了一个异常,告知调用者
public void show() throws Exception{
 
    throw new RuntimeException();
}

// 调用者需要继续 处理异常 或者 抛出异常
public void test() throws Exception {
 
    show();
}
父子类中的异常
子类中声明的异常的范围不能超过父类声明的异常范围:
<=
如下错误实例:

public class A {
 
    // 父类抛出的IOException是Exception的子类
    public void show() throws IOException{
        
    }
}
class B extends A {
 

    // 这个方法会编译报错,不能抛出比父类方法范围大的异常
    @Override
    public void show() throws Exception {
 
        
    }
}
自定义异常
为了封装异常和快速定位异常,我们可以自定义异常。

自定义异常通常继承于 Exception 或 RuntimeException ,到底继承那个应该看具体情况来定。

自定义异常类可以有自己的变量和方法来 传递错误代码 或 传递其它异常相关信息 。实际工作中,都会自定义异常类来处理异常。

自定义非受查异常
class CheckedException extends Exception {
 

    public CheckedException() {
 
        // 调用父类的默认构造函数
        super();
    }

    public CheckedException(String message) {
 
        // 手动调用父类的构造方法
        super(message);
    }

}
自定义受查异常(常用)
class BusinessException extends RuntimeException {
 

    public BusinessException() {
 
        // 调用父类的默认构造函数
        super();
    }

    public BusinessException(String message) {
 
        // 手动调用父类的构造方法
        super(message);
    }

}
手动抛出异常(伪代码)。如在springboot项目中我们配置好全局捕获异常的增强后,可以直接在程序中抛出异常。如下涉及到一些业务逻辑。

Order o = orderService.getById(5);
if(Objects.isNull(o)) {
 
    throw new BusinessException("订单为空了");
}
抛出异常后,会被全局的捕获异常增强捕获,然后返回通用的数据格式给客户端。

异常的分类

两种异常分类的区别

异常的5个关键字, try 、 catch 、 finally 、 throws 、 throw

处理异常:捕获处理、抛出交给调用者处理

异常捕获顺序,先捕获子类异常,再去捕获父类异常

父子继承关系中方法重写要注意的,子类抛出异常的范围不能大于父类异常范围

SpringBoot中如何处理异常
在Java程序中我们知道:程序中可能出现的非受查异常或受查异常我们都可已进行处理(不包括Error错误),如使用try-catch进行捕获处理,或者直接抛出异常,让调用者处理。

在SpringBoot项目中,由于要给客户端(前端)返回各种各样的数据,这些数据通常都是需要规定统一的数据格式进行返回,而当涉及到程序异常时,如何给客户端返回一些提示信息?

定义一个异常类
@Data
public class BusinessException extends RuntimeException{
 

    private static final long serialVersionUID = 1L;

    private String msg;
    private int code = 500;

    public BusinessException(String msg) {
 
        super(msg);
        this.msg = msg;
    }

    public BusinessException(String msg, Throwable e) {
 
        super(msg, e);
        this.msg = msg;
    }

    public BusinessException(String msg, int code) {
 
        super(msg);
        this.msg = msg;
        this.code = code;
    }

    public BusinessException(String msg, int code, Throwable e) {
 
        super(msg, e);
        this.msg = msg;
        this.code = code;
    }
}
SpringBoot配置全局异常捕获
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
 

    @ExceptionHandler(Exception.class)
    public R handleException(Exception e, HttpServletRequest request) {
 
        log.error(request.getRequestURI() + ":服务运行异常------> {}", e);
        return R.buildFail("服务运行异常" + e.getMessage());
    }

    /**
     * 自定义异常处理
     */
    @ExceptionHandler(BusinessException.class)
    public R handleException(BusinessException e, HttpServletRequest request) {
 
        log.error(request.getRequestURI() + ":自定义内部异常------> {}", e);
        return R.buildFail(e.getMsg());
    }

}
在开发过程中,如果程序出现异常那么会报错抛出异常,那么我们直接用这个全局异常捕获到后,直接返回给客户端一个提示即可。

实际上在开发中,我们都是自定义 RuntimeException 的子类异常(非受查异常),然后加以运用完善异常的处理机制。

更多资料 点击此处获取

聚圣源半截白菜台北新视听父母的爱作文中华周易研究会免费起名网站指环王高清下载起名 五行 八字秦姓男孩鼠年起名网上起名准不源字起名软著怎么起名字免费起名网评分表属牛宝宝起名大全大全投资公司起什么名字暴君的炮灰男后广州酒家巴基斯坦外长钻石戒指起名大全dongfangweishi重庆二手市场网上起名字靠谱没城中大盗起个好听的微店名字外国人英语免费在线起名字宝宝免费起名网站一姓氏薛起名男孩子张姓羊年宝宝起名实习鉴定评语我有五个大佬爸爸免费阅读紫原敦淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化