Java异常处理传递规范总结

news2024/11/15 8:45:00

java 异常分类

在这里插入图片描述

  • Thorwable类(表示可抛出)是所有异常和错误的超类,两个直接子类为Error和Exception,分别表示错误和异常。
  • 其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常, 这两种异常有很大的区别,也称之为非检查异常(Unchecked Exception)和检查异常(Checked Exception),其中Error类及其子类也是非检查异常。

检查异常和非检查异常

  • 检查异常也称为“编译时异常”,编译器在编译期间检查的那些异常。由于编译器“检查”这些异常以确保它们得到处理,因此称为“检查异常”。如果抛出检查异常,那么编译器会报错,需要开发人员手动处理该异常,要么捕获,要么重新抛出。除了RuntimeException之外,所有直接继承 Exception 的异常都是检查异常。
  • 非检查异常:也称为“运行时异常”,编译器不会检查运行时异常,在抛出运行时异常时编译器不会报错,当运行程序的时候才可能抛出该异常。Error及其子类和RuntimeException 及其子类都是非检查异常。

异常处理分为三个阶段:捕获->传递->处理。try……catch的作用是捕获异常,throw的作用将异常传递给合适的处理程序。捕获、传递、处理,三个阶段,任何一个阶段处理不当,都会影响到整个系统。下面分别介绍一下常见的异常处理不规范案例。

java 异常处理不规范案例

捕获

  • 捕获异常的时候不区分异常类型
  • 捕获异常不完全,比如该捕获的异常类型没有捕获到
try{
    ……
} catch (Exception e){ // 不应对所有类型的异常统一捕获,应该抽象出业务异常和系统异常,分别捕获
    ……
}

传递

  • 异常信息丢失
  • 异常信息转译错误,比如在抛出异常的时候将业务异常包装成了系统异常
  • 吃掉异常
  • 不必要的异常包装
  • 检查异常传递过程中不适用非检查检异常包装,造成代码被throws污染
try{
    ……
} catch (BIZException e){ 
    throw new BIZException(e); // 重复包装同样类型的异常信息 
} catch (Biz1Exception e){ 
    throw new BIZException(e.getMessage()); // 没有抛出异常栈信息,正确的做法是throw new BIZException(e); 
} catch (Biz2Exception e){
    throw new Exception(e); // 不能使用低抽象级别的异常去包装高抽象级别的异常,这样在传递过程中丢失了异常类型信息
} catch (Biz3Exception e){
    throw new Exception(……); // 异常转译错误,将业务异常直接转译成了系统异常
} catch (Biz4Exception e){
    …… // 不抛出也不记Log,直接吃掉异常
} catch (Exception e){
    throw e;
}

处理

  • 重复处理
  • 处理方式不统一
  • 处理位置分散
try{
    try{
        try{
            ……
        } catch (Biz1Exception e){
            log.error(e);  // 重复的LOG记录
            throw new e;
        }
        
        try{
            ……
        } catch (Biz2Exception e){
            ……  // 同样是业务异常,既在内层处理,又在外层处理
        }
    } catch (BizException e){
        log.error(e); // 重复的LOG记录
        throw e;
    }
} catch (Exception e){
    // 通吃所有类型的异常
    log.error(e.getMessage(),e);
}

java 异常处理规范案例

1、阿里巴巴Java异常处理规约

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

阿里巴巴Java开发规范中有15条异常处理的规约,其中下面两条使用的时候是比较困惑的,因为并没有告诉我们应该如何定义异常,如何抛出异常,如何处理异常:

  • 【强制】捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。
  • 【推荐】定义时区分unchecked / checked 异常,避免直接使用RuntimeException抛出,更不允许抛出Exception或者Throwable,应使用有业务含义的自定义异常。

2、异常处理最佳实践

1、使用 try-with-resource 关闭资源。

2、抛出具体的异常而不是 Exception,并在注释中使用 @throw 进行说明。

3、捕获异常后使用描述性语言记录错误信息,如果是调用外部服务最好是包括入参和出参。

logger.error(“说明信息,异常信息:{}”, e.getMessage(), e)

4、优先捕获具体异常。

5、不要捕获 Throwable 异常,除非特殊情况。

6、不要忽略异常,异常捕获一定需要处理。

7、不要同时记录和抛出异常,因为异常会打印多次,正确的处理方式要么抛出异常要么记录异常,如果抛出异常,不要原封不动的抛出,可以自定义异常抛出。

8、自定义异常不要丢弃原有异常,应该将原始异常传入自定义异常中。

throw MyException(“my exception”, e);

9、自定义异常尽量不要使用检查异常。

10、尽可能晚的捕获异常,如非必要,建议所有的异常都不要在下层捕获,而应该由最上层捕获并统一处理这些异常。。

11、为了避免重复输出异常日志,建议所有的异常日志都统一交由最上层输出。就算下层捕获到了某个异常,如非特殊情况,也不要将异常信息输出,应该交给最上层统一输出日志。

参考

https://zhuanlan.zhihu.com/p/617291696

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/488500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 概述及常用命令(一)

1、Linux 简介 Linux 是一套免费使用和自由传播的类 Unix 操作系统(主要用在服务器上),是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。 目前市面上较知名的发行版有:Ubuntu,RedHat&…

大学生创业者最关心的问题——校园外卖到底能不能盈利?

与前十年的寒窗苦读相比,大学自由散漫的生活略显空虚。除了学习,学生们还有很多时间自由安排。有些人选择颓废,有些人选择勤奋。而校园创业是许多有想法的大学生都会做的事情。其中,外卖跑腿配送是特别受欢迎的创业项目之一。 那…

五月到了,再来看看ChatGPT给我们带来了什么吧!

ChatGPT,即聊天生成预训练转换器(Chat Generative Pre-trained Transformer),是美国OpenAI公司基于GPT-3.5架构(目前已经更新到GPT-4,但仅限于Plus用户)研发和强化训练的一款人工智能聊天机器人…

C++学习day--04 图形化开发环境搭建

1、为什么要搭建图形化开发环境 因为很多初学者学习C就是单纯的控制台打印输出,很枯燥,我们今后在做项目或者在学习的过程中,采用图形化方式相结合的方法学习,再学习中体会编程带来的快乐。先说明一下,奇牛课程是边学…

YOLOv6 4.0 使用记录:python推理 OpenCV DNN 推理

目录 1、下载源码 2、下载权重文件 3、配置环境 4、推理 6、ONNX格式导出 权重文件为yolov6list_s.pt 权重为yolov6.pt 7、opencv DNN推理 8、个人总结 1、下载源码 下载最新的4.0版本的 2、下载权重文件 我下的是YOLOv6Lite-S 3、配置环境 cd到项目目录,运…

关于IDEA编译运行时出现 《非法字符: ‘\ufeff‘ 需要class,interface或enum》的解决办法

问题如下 原因:编码问题解决办法:将这些报错的文件拷贝到一个目录中,然后用notpad打开,点击工具类上的 编码,将 以uft8格式编码 转为 以utf8无BOM格式编码,然后保存,再覆盖idea中对应的文件。或…

人脸识别--传统+深度方法

人脸识别算法--非深度方法 在前深度学习时代,非深度的方法探索了不同的人脸识别算法。 先考虑一下非深度学习时代,人脸识别难在哪?或者说目标识别的难点在哪? 图像是一个高度冗余的数据。 * 图像数据中包含大量与语义无关的内容…

Hadoop3.3.1 Windows环境配置

1.解压hadoop-3.3.1.tar.gz 到windows安装路径 D:\h3\hadoop-3.3.1 2.检查Windows jdk是否安装正常 3.下载winutils GitHub - steveloughran/winutils: Windows binaries for Hadoop versions (built from the git commit ID used for the ASF relase) 解压到D:\h3\ 并重命名…

Python每日一练(20230504) 课程表 Course Schedule I/II

目录 1. 课程表 Course Schedule I 2. 课程表 Course Schedule II 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 课程表 Course Schedule I 你这个学期必须选修 numCourses 门课程&a…

五一劳动节程序员应该知道的知识——计算机

前言 现在AI崛起,计算机已经成为我们不可或缺的一部分,几乎在所有行业和领域都有广泛应用 。 五一已经快要过去了,程序员们应该都放假了,那我们是不是应该去了解了解我们的伙伴——计算机,了去解计算机是怎样工作的&am…

在CSDN逮到一个字节10年老测试开发,聊过之后收益良多···

老话说的好,这人呐,一单在某个领域鲜有敌手了,就会闲得蛋疼。前几天我在上班摸鱼刷CSDN的时候认识了一位字节测试开发大佬,在字节工作了10年,因为本人天赋比较高,平时工作也兢兢业业,现在企业内…

REST API 最佳实践

文章目录 0.什么是 REST API?1.REST API 设计建议1.用名词表示资源2.用复数名词表示集合3.在端点上使用嵌套显示关系4.用 HTTP 方法操作资源5.用过滤、排序和分页请求数据6.用 JSON 作为发送和接收数据的格式7.将实际数据包装在 data 字段中8.非资源请求用动词9.考虑…

搭建环境问题集合(jupyter lab和pycharm)

1、python console找到该项目映射位置在哪里? import os print(os.getcwd()) 2、Linux终端运行命令,Ctrlc & Ctrlz 在Linux中,Ctrl Z组合键可以将当前正在运行的进程暂停,并将该进程放到后台去执行。 linux命令行下Ctrlc的作…

uniapp实现小程序打开相册或拍照上传图片附赠兼容H5方法

文章目录 前言一、支持相册选择和拍照二、删除图片三、效果图存在问题 前言 小程序上传图片,或者拍照上传图片,并附带兼容H5上传图片方法,压缩图片。 一、支持相册选择和拍照 支持选择相册和拍照,可以使用uniapp提供的api&#…

arxiv2022 | MolT5:Translation between Molecules and Natural Language

Ambitious goal !! 任务:molecule captioning and text-guided de novo molecule generation. 论文链接:https://arxiv.org/abs/2204.11817 代码链接:GitHub - blender-nlp/MolT5: Associated Repository for "…

MySQL知识学习03(三大日志详解 binlog、redo log、undo log)

前言 MySQL 日志 主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中,比较重要的还要属二进制日志 binlog(归档日志)和事务日志 redo log(重做日志)和 undo log(回滚日志&#xf…

【校招VIP】很神奇,把简历上的学校名称和姓名盖住,其它的部分都很常见,那简历通过率一定很低

在五一之前的一场简历指导的直播里面,发现了一份有意思的简历。 大家如果把这份简历的学校和姓名抹掉,会发现好像跟自己写的简历一模一样。 技能、项目等都是很通用的。 也就是说,这份简历你能写,你的同学也可以写,甚…

项目执行落地的6个步骤

项目执行是将项目计划付诸行动的过程,为客户或利益相关者生产可交付的产品或服务,也就是所谓的产品或服务。它发生在规划阶段之后,在此期间,一个团队确定了项目的关键目标,以及时间表和预算。 执行包括协调资源和衡量…

现在的00后测试员这么野?领导:这我真管不了...

马上就要迎来一年一度的毕业季,今年即将有1158万00后毕业生正式踏入职场。虽然00后是最近两年才晋升为新鲜出炉的职场小鲜肉,但在一众前辈的眼中,已经身居重任,期望他们能够成为职场中的一股清流,改变一贯以来的职场风…

I2C工作流程

FM33A0XX的I2C接口只用作主机,且不支持多主机,因此挂在总线上的其他设备都是从机。总线上总是由主机提供同步时钟SCL,SDA数据流方向可以是主机发送从机接收,或者从机发送主机接收。 数据发送流程 1、主机发起 START 时序 2、主机…