java异常 | 处理规范、全局异常、Error处理

文章目录

    • 🚃异常类型
      • 🎠显示声明异常:
        • ①:try-catch
        • ②方法签名
    • 🚃异常处理规范
      • ⚓️异常包装
      • ⚓️异常传递
      • ⚓️异常日志记录
      • ⚓️异常处理的最佳实践
    • 🚃全局异常处理
      • ⛵️优点:
      • ⛵️代码示例:
      • ⛵️注意:
    • 🚃Error类型的异常如何处理
      • ⛲️常见Error异常
      • ⛲️处理建议
        • 1. 不要捕获后不处理:
        • 2. 记录错误日志:
        • 3. 异常监控和报警:
        • 4. 优雅降级:
      • ⛲️结论


🚃异常类型

在这里插入图片描述

异常大类发生场景
Throwable所有异常的根类
Error由虚拟机或系统引发的异常
ExceptionRuntimeException :运行时异常,不需要显式捕获或声明;非RuntimeException:必须显式捕获或声明的异常

🎠显示声明异常:

①:try-catch

try {
    // 执行可能抛出Runtime异常的代码
} catch (ClassCastException e) {
    throw new CustomException("业务处理异常", e);
}

②方法签名

public void method() throws ClassCastException{
    // 可能抛出Runtime的代码
}

🚃异常处理规范

⚓️异常包装

   规范:
       捕获异常后,将其包装为自定义异常,并添加更多的上下文信息。

  1. 按业务划分异常:可以更好地反映业务逻辑和场景,使得异常的处理更加准确和精细化。例如,在电商应用中可以定义订单异常、库存异常、支付异常等来表示不同的业务异常情况。
  2. 按层划分异常:可以更好地将异常的处理与各层的责任分离开来。例如,在多层架构中,可以定义表示数据访问层异常的数据库异常、表示业务逻辑层异常的业务异常、表示展示层异常的界面异常等。
  3. 按其他需求划分异常常:例如按照功能模块、错误类型、系统模块等进行划分。

   代码示例:
try {
    // 执行可能抛出异常的代码
} catch (Exception e) {
    // 将异常包装为自定义异常,添加更多上下文信息
    throw new CustomException("业务处理异常", e);
}

⚓️异常传递

   规范:
       在方法签名中明确声明可能抛出的受检异常,以便上层调用者知晓,并在适当的层次处理异常。

   代码示例:

public void method() throws IOException {
   // 可能抛出IOException的代码
}

⚓️异常日志记录

   规范:
       在异常处理过程中,记录异常相关的信息,如异常类型、异常堆栈信息、触发异常的位置等。

   代码示例:

try {
   // 可能抛出异常的代码
} catch (Exception e) {
   logger.error("异常类型: " + e.getClass().getSimpleName());
   logger.error("异常堆栈信息: ", e);
}

⚓️异常处理的最佳实践

   规范:
       避免捕获过宽的异常类型,尽量捕获具体的异常类型;在合适的地方捕获异常,不要滥用异常捕获;及时关闭资源,避免资源泄露等。

   代码示例:

try {
   // 可能抛出特定异常的代码
} catch (SpecificException se) {
   // 处理特定异常的逻辑
}

🚃全局异常处理

⛵️优点:

   确保在应用程序的各个层次中,无论是控制器、服务层还是数据访问层,都能够捕获和处理异常。

⛵️代码示例:

/**
 * @Description: 全局异常类
 * @Version: 1.0
 */
 
@ControllerAdvice//使用该注解表示开启了全局异常的捕获
public class GlobalExceptionHandler {
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    /**
     * 处理空指针的异常
     *
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value = NullPointerException.class)
    @ResponseBody
    public FrontResult exceptionHandler(HttpServletRequest req, NullPointerException e) {
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("发生空指针异常!原因是:", e);
        return FrontResult.getExceptionResult(ResultCodeEnum.FAIL.getCode(), ResultMsgEnum.EXECUTE_FAIL.getMsg());
    }

    /**
     * 处理索引越界异常
     *
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value = IndexOutOfBoundsException.class)
    @ResponseBody
    public FrontResult exceptionHandler(HttpServletRequest req, IndexOutOfBoundsException e) {
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("索引越界异常!原因是:", e);
        return FrontResult.getExceptionResult(ResultCodeEnum.FAIL.getCode(), ResultMsgEnum.EXECUTE_FAIL.getMsg());
    }

    /**
     * 处理类未找到异常
     *
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value = ClassNotFoundException.class)
    @ResponseBody
    public FrontResult exceptionHandler(HttpServletRequest req, ClassNotFoundException e) {
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("发生类未找到异常!原因是:", e);
        return FrontResult.getExceptionResult(ResultCodeEnum.FAIL.getCode(), ResultMsgEnum.EXECUTE_FAIL.getMsg());
    }

    /**
     * 处理SQL异常
     *
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value = SQLException.class)
    @ResponseBody
    public FrontResult exceptionHandler(HttpServletRequest req, SQLException e) {
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("发生SQL异常!原因是:", e);
        return FrontResult.getExceptionResult(ResultCodeEnum.FAIL.getCode(), ResultMsgEnum.EXECUTE_FAIL.getMsg());
    }

    /**
     * 处理IO异常
     *
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value = IOException.class)
    @ResponseBody
    public FrontResult exceptionHandler(HttpServletRequest req, IOException e) {
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("发生IO异常!原因是:", e);
        return FrontResult.getExceptionResult(ResultCodeEnum.FAIL.getCode(), ResultMsgEnum.EXECUTE_FAIL.getMsg());
    }

    /**
     * 处理其他异常
     *
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public FrontResult exceptionHandler(HttpServletRequest req, Exception e) {
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("未知Exception!原因是:", e);
        return FrontResult.getExceptionResult(ResultCodeEnum.FAIL.getCode(), ResultMsgEnum.EXECUTE_FAIL.getMsg());
    }

    /**
     * 处理Error异常
     *
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value = Error.class)
    @ResponseBody
    public FrontResult errorHandler(HttpServletRequest req, Error e) {
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("未知Error!原因是:", e);
        // 发送警报通知
        sendAlertNotification();
        
        // 执行清理操作(关闭数据库连接、释放资源等)
        cleanup();
        
        // 终止应用程序
        System.exit(1);
    }
}

⛵️注意:

   全局异常处理应该是最后的防线,用于捕获未被处理的异常。在应用程序的各个层次中,尽量在局部进行异常处理,以确保能够在发生异常时立即采取适当的措施


🚃Error类型的异常如何处理

   对于Java中的Error类型异常,通常是指严重的系统级错误,它们通常无法被应用程序处理或恢复,并且可能会导致应用程序的非正常终止,所以Error类型的异常一定要被开发人员重视。

⛲️常见Error异常

类型发生场景
OutOfMemoryError内存溢出错误,表示应用程序在申请内存时无法满足需求
StackOverflowError栈溢出错误,表示方法调用的层级过深,导致栈空间不足
NoClassDefFoundError找不到类定义错误,表示在运行时无法找到所需的类文件
NoSuchMethodError找不到方法错误,表示在运行时无法找到所需的方法
ExceptionInInitializerError表示在静态初始化期间发生异常
IllegalAccessError表示非法访问类、字段或方法
AbstractMethodError表示抽象方法没有被实现或覆盖
AssertionError断言错误,表示断言语句失败

⛲️处理建议

   以下是处理Error类型异常的一些常见做法:

1. 不要捕获后不处理:

   Error类型的异常会导致应用程序无法正常运行,处理这些异常的主要目标是尽快终止程序的执行,以避免进一步的损害或数据丢失。即时捕获记录错误信息后,也应继续抛出异常,让这些异常冒泡到应用程序的顶层,由Java虚拟机或操作系统来处理。

2. 记录错误日志:

   当发生Error类型异常时,及时记录错误信息到日志中,以便后续的故障排查和分析。可以使用日志框架(如log4j、logback等)、或java虚拟机的错误日志来记录错误信息,并确保日志配置正确,以便及时获取异常的详细信息。

//配置java虚拟机错误日志
java -XX:ErrorFile=/path/to/error.log -jar xxxxx.jar

3. 异常监控和报警:

   设置合适的异常监控和报警机制,当系统发生Error类型异常时,及时通知相关人员或团队尽快处理。可以使用监控工具和服务(如Prometheus、Grafana等)来实现异常监控和报警功能。

4. 优雅降级:

   在面对严重的Error异常时,可以考虑进行优雅降级处理。例如,通过切换到备用服务、提供默认值或警告消息等方式,尽量保持系统的可用性,并减少对用户的影响。

⛲️结论

   在面对Error异常时,重要的是及时记录、报警、定位问题,并采取适当的措施来保证系统的稳定性和可用性,及时发现及时处理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv7训练自定义数据集

使用YOLOv7做对比实验,需要重新部署一下YOLO环境,并将COCO格式数据集转换为YOLO格式 博主的COCO数据集是由WiderPerson数据集转换来的,并且做了一些处理。 环境 Ubuntu18.0 CUDA11.2 NVIDIA T4 项目部署 下载项目: git clone…

PureComponent和Component的区别和底层处理机制

PureComponent和Component都是React中的组件类,但它们在实现细节和使用上有些差别。 Component是React中定义组件的基类,它的shouldComponentUpdate方法默认返回true,也就是说,每次调用setState或forceUpdate方法都会引发组件重新…

算法提高-图论-单源最短路的综合应用

单源最短路的综合应用 单源最短路的综合应用AcWing 1135. 新年好AcWing 340. 通信线路AcWing 342. 道路与航线AcWing 341. 最优贸易 单源最短路的综合应用 AcWing 1135. 新年好 多次dijkstra求每个点到其它点的最短距离, 此时相当于建好了一张图,每个点…

实验篇(7.2) 09. 通过安全隧道走对方宽带上网 (FortiClient-IPsec) ❀ 远程访问

【简介】要想所有的流量都走安全隧道,就需要禁用隧道分割。这样上网流量也会通过隧道到达远端防火墙,再通过远端防火墙的宽带接口去到互联网。我们来看看FortiClient客户端用IPsec VPN是如何实现的。 实验要求与环境 OldMei集团深圳总部防火墙有两条宽带…

【运筹优化】最短路算法之A星算法 + Java代码实现

文章目录 一、A星算法简介二、A星算法思想三、A星算法 java代码四、测试 一、A星算法简介 A*算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。 二、A星算…

javaScript蓝桥杯-----天气趋势 A

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 日常生活中,气象数据对于人们的生活具有非常重要的意义,数据的表现形式多种多样,使用图表进行展示使数据在呈现上更加直观。 本题请实现一个 Y 城 2022 年的天气趋势图。 二、准备…

100天精通Python(可视化篇)——第88天:全网最全Seaborn库常用绘图3万字总结(参数说明+案例实战)

文章目录 一、Seaborn介绍1.1 介绍1.2 安装1.3 风格设置1.3.1 style(风格)1.3.2 context(环境设置) 1.4 调色盘设置1.5 数据集下载 二、Relational plots(关系图)2.1 scatterplot(散点图&#x…

SpringSecurity 总结

SpringSecurity 总结 第一章 权限管理 权限管理SpringSecurity 简介整体架构 权限管理: 实现: "对用户访问系统的控制"(身份认证) , 按照 "安全规则"或者 "安全策略" (对已经认证的用户进行授权) 控制,用…

K8s in Action 阅读笔记——【13】Securing cluster nodes and the network

K8s in Action 阅读笔记——【13】Securing cluster nodes and the network 13.1 Using the host node’s namespaces in a pod Pod中的容器通常在不同的Linux名称空间下运行,这使得它们的进程与其他容器或节点默认名称空间下运行的进程隔离开来。 例如&#xff…

【计算机组成与体系结构Ⅰ】课程设计——基于Logisim的模型计算机设计

基于Logisim的模型计算机设计 一、实验目的 基于Logisim软件,根据一个模型指令系统,在逐步学习和了解计算机组成各部分逻辑组成和各部分互联的基础上,深入理解课程中的知识点,利用此软件设计并实现一个模拟的8位模型计算机原型。…

Python爬取影评并进行情感分析和数据可视化

Python爬取影评并进行情感分析和数据可视化 文章目录 Python爬取影评并进行情感分析和数据可视化一、引言二、使用requestsBeautifulSoup进行影评的爬取1、分析界面元素2、编写代码 三、情感分析1、数据预处理2、情感分析3、数据可视化 一、引言 前几天出了《航海王&#xff1…

delete 清空表之后,磁盘空间未发生变化?

上篇文章结尾和小伙伴们留了一个小问题,就是关于 optimize table 命令,今天我想花点时间再来和小伙伴们聊一聊这个话题。 1. 删除空洞 1.1 案例展示 首先我们先来看这样一个例子。 我现在有一个名为 sakila 的数据库,该库中有一个 film 表…

x宝评论抓取

#某宝评论接口sign参数逆向 1.接口速览 多次请求发现,t为时间戳,sign为加密参数,盲猜和data、t有关,sign为32位,盲猜是字符串的32位的MD5 2.搜索js代码 这里为搜索的是appKey,就找到了sign,然…

【CSS】常见的选择器

1.标签选择器 语法 标签 { }作用 标签选择器用于选择某种标签比如 选择p标签,并设置背景颜色 p { background-color:yellow; }例子 选择div标签,并将其字体大小设置为100px,字体设置为"微软雅黑",文字颜色设置为r…

UDP协议和TCP协议

目录 UDP TCP 通过序列号与确认应答提高可靠性 为什么TCP是三次握手 为什么是四次挥手 超时重传机制 流控制 利用窗口控制提高速度 窗口控制与重发控制 拥塞控制 延迟确认应答 捎带应答 UDP UDP是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。…

从零开始,5分钟轻松实现Spring Boot与RabbitMQ的无缝集成

🌏 环境 docker v4.16.2springboot 2.7.0RabbitMQ 3.9.1 rabbitmq_delayed_message_exchange 3.9.0 ps:代码地址 gitee 🪜 服务架构 使用maven多模块,将生产者、消费者分别以springboot项目启动,两者通过RabbitMQ…

面试总结个人版

一、面试题 java 集合 , spring springmvc springboot springcloud 数据库相关的, redis 相关 ,mq 相关 ,结合业务的场景题 1、part one 集合 HashMap底层原理 HashMap是基于哈希表的Map接口的非同步实现。元素以键值对的形式存…

AI-Prompt 1.0 版简介公测!你的AI提示词网站!

提示词(Prompt) 是什么? 在 AI 大模型中,一个 prompt 是一个输入文本,用于触发模型生成输出。例如,当我们向一个 AI 大模型提交需求时,我们的需求就是一个 prompt。 在介绍产品之前,…

CoreDX DDS应用开发指南(4)DDS实体h和主题

6 DDS实体 DDS标准定义了一个体系结构,该体系结构表示构成DDS API实体的面向对象模型。这些实体充当中间件和应用软件之间的接口。为了开发支持DDS的应用程序,开发人员必须创建、交互并销毁这些DDS实体。 本章概述了DDS实体和相关概念。 6.1 DDS实体层次结构 构成DDS API的主…

OpenELB 在 CVTE 的最佳实践

作者:大飞哥,视源电子股份运维工程师, KubeSphere 社区用户委员会广州站站长,KubeSphere Ambassador。 公司介绍 广州视源电子科技股份有限公司(以下简称视源股份)成立于 2005 年 12 月,旗下拥…
最新文章