Java-异常:不恰当的异常转换、不充分的日志记录、过度或不当的异常捕获

Java-异常:不恰当的异常转换、不充分的日志记录、过度或不当的异常捕获

  • Java-异常:不恰当的异常转换、不充分的日志记录、过度或不当的异常捕获
    • 一、前期准备
    • 二、案例分析
      • 1、不恰当的异常转换
      • 2、不充分日志记录
      • 3、过度或不当的异常捕获
    • 三、正确处理方式
      • 1、方式1
      • 2、方式2

Java-异常:不恰当的异常转换、不充分的日志记录、过度或不当的异常捕获

异常相关概念可以参考:秋刀鱼不做梦-Java 异常处理详解

在这里,我重点针对异常不恰当的转换不充分的日志记录过度或不当的异常捕获的问题来说

一、前期准备

封装API的响应结果

@Data
@AllArgsConstructor
public class APIResponse<T> {private boolean success;private T data;private int code;private String message;
}

自定义异常

public class BusinessException extends RuntimeException {private int code;public BusinessException(String message, int code) {super(message);this.code = code;}public int getCode() {return code;}
}

定义全局异常处理器

@RestControllerAdvice
@Slf4j
public class RestControllerExceptionHandler {private static int GENERIC_SERVER_ERROR_CODE = 2000;private static String GENERIC_SERVER_ERROR_MESSAGE = "服务器忙,请稍后再试";@ExceptionHandlerpublic APIResponse handle(HttpServletRequest req, HandlerMethod method, Exception ex) {if (ex instanceof BusinessException) {BusinessException exception = (BusinessException) ex;log.warn(String.format("访问 %s -> %s 出现业务异常!", req.getRequestURI(), method.toString()), ex);return new APIResponse(false, null, exception.getCode(), exception.getMessage());} else {log.error(String.format("访问 %s -> %s 出现系统异常!", req.getRequestURI(), method.toString()), ex);return new APIResponse(false, null, GENERIC_SERVER_ERROR_CODE, GENERIC_SERVER_ERROR_MESSAGE);}}
}

一个异常处理器,用于处理@RestController注解的控制器中抛出的异常。它使用@Slf4j注解来使用日志记录功能

  • @RestControllerAdvice注解表示这是一个全局异常处理类。
  • @ExceptionHandler注解表示该方法用于处理异常。
  • handle方法用于捕获异常,并根据异常类型返回不同的响应。
    • 如果异常是BusinessException类型,则记录日志并返回一个包含异常信息的APIResponse对象。
    • 如果异常不是BusinessException类型,则记录日志并返回一个包含通用错误信息的APIResponse对象。

controller

@Slf4j
@RestController
@RequestMapping("handleexception")
public class HandleExceptionController {//……private void readFile() throws IOException {Files.readAllLines(Paths.get("a_file"));}
}

二、案例分析

@GetMapping("exception")
public void exception(@RequestParam("business") boolean b) {if (b)throw new BusinessException("订单不存在", 2001);throw new RuntimeException("系统错误");
}

在这里插入图片描述

自定义异常生效

1、不恰当的异常转换

    @GetMapping("wrong1")public void wrong1() {try {readFile();} catch (IOException e) {throw new RuntimeException("系统忙请稍后再试");}}

在这里插入图片描述

问题将具体的IOException转换为非具体的RuntimeException,失去了原始异常的详细信息,不利于问题的定位和调试。应该尽可能保留或封装原始异常,以便于追踪错误源头

2、不充分日志记录

    @GetMapping("wrong2")public void wrong2() {try {readFile();} catch (IOException e) {log.error("文件读取错误, {}", e.getMessage());throw new RuntimeException("系统忙请稍后再试");}}

在这里插入图片描述

问题

  • 虽然记录了日志但异常转换仍存在问题:与wrong1类似,该方法虽然在抛出新异常前记录了详细的错误信息,但是最终抛出的是一个不包含原始异常信息的RuntimeException。这会导致堆栈跟踪信息丢失,不易于问题诊断。
  • 可以改进日志内容:虽然记录了错误信息,但是直接使用e.getMessage()可能不足以覆盖所有上下文信息,理想情况下应考虑记录更多上下文,如当前执行的操作、涉及的变量值等。

3、过度或不当的异常捕获

    @GetMapping("wrong3")public void wrong3(@RequestParam("orderId") String orderId) {try {readFile();} catch (Exception e) {log.error("文件读取错误", e);throw new RuntimeException();}}

在这里插入图片描述

问题

  • 过度捕获异常使用了非常广泛的Exception进行捕获,这意味着它会捕获所有类型的异常,包括那些可能本应由上层处理或根本就不应该被捕获的异常。这可能导致隐藏问题使得某些异常被不恰当地处理
  • 缺少异常信息抛出的RuntimeException没有提供任何具体信息,这对于调试和日志记录是非常不利的。至少应该提供一个有意义的错误消息
  • 日志记录不完整:虽然记录了错误日志,但是没有利用占位符插入异常信息(e)到日志消息中,这可能会遗漏重要的异常详情

上述的问题主要影响系统的可维护性和故障排查能力,所以我们需要更加细致地处理异常,保留异常链,以及提供充分的日志信息

三、正确处理方式

1、方式1

    @GetMapping("right1")public void right1() {try {readFile();} catch (IOException e) {log.error("文件读取错误", e);throw new RuntimeException("系统忙请稍后再试");}}

在这里插入图片描述

2、方式2

    @GetMapping("right2")public void right2() {try {readFile();} catch (IOException e) {throw new RuntimeException("系统忙请稍后再试", e);}}

在这里插入图片描述

方式1和方式2虽然表达不一样,但是都解决了:不恰当的异常转换、不充分的日志记录、过度或不当的异常捕获的问题,虽然代码简单,但是涉及异常操作时,也要引起重视,不然,出bug了,不好搞

  • 异常精确捕获,并精确处理,比方说上面right1和right2都是IOException
  • 获取更详细的异常日志,直接打印 e
  • 注意异常转换,丢失异常的上下

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

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

相关文章

Open WebUI – 本地化部署大模型仿照 ChatGPT用户界面

Open WebUI介绍&#xff1a; Open WebUI 是一个仿照 ChatGPT 界面&#xff0c;为本地大语言模型提供图形化界面的开源项目&#xff0c;可以非常方便的调试、调用本地模型。你能用它连接你在本地的大语言模型&#xff08;包括 Ollama 和 OpenAI 兼容的 API&#xff09;&#xf…

emqx5.6.1 数据、配置备份与迁移

EMQX 支持导入和导出的数据包括&#xff1a; EMQX 配置重写的内容&#xff1a; 认证与授权配置规则、连接器与 Sink/Source监听器、网关配置其他 EMQX 配置内置数据库 (Mnesia) 的数据 Dashboard 用户和 REST API 密钥客户端认证凭证&#xff08;内置数据库密码认证、增强认证…

公共网络IP地址不正确?别担心,这里有解决方案

在数字化时代&#xff0c;公共网络IP地址的正确性对于我们的在线体验至关重要。它不仅是网络连接的标识&#xff0c;更是确保我们正常访问互联网资源、享受网络服务的基础。然而&#xff0c;有时我们可能会遇到公共网络IP地址不正确的情况&#xff0c;这不仅会影响我们的网络速…

【已解决】SpringBoot图片更新需重启服务器才能显示

问题描述 1、更新头像&#xff0c;并跳转回列表页&#xff0c;发现显示不出来 2、但是前端获取用户头像的信息是在加载页面就会被调用的&#xff0c;同时前端也不存在所谓的缓存问题&#xff0c;因为没有动这部分代码。 但查看响应是能获得正确的信息&#xff08;前端打印图片…

数据结构--单链表(图文)

单链表的概念 在单链表中&#xff0c;每个元素&#xff08;称为节点&#xff09;包含两部分&#xff1a;一部分是存储数据的数据域&#xff0c;另一部分是存储下一个节点地址的指针域。这里的“单”指的是每个节点只有一个指向下一个节点的指针。 节点&#xff1a;链表中的基…

Apple - Secure Coding Guide

本文翻译整理自&#xff1a;Secure Coding Guide https://developer.apple.com/library/archive/documentation/Security/Conceptual/SecureCodingGuide/Introduction.html#//apple_ref/doc/uid/TP40002477-SW1 文章目录 一、安全编码指南简介1、概览黑客和攻击者没有平台是免疫…

【办公类-50-01】20240620自主游戏观察记录表19周内容打乱

背景需求&#xff1a; 又到了期末&#xff0c;各种班级资料需要提交。 有一份自主游戏观察记录需要写19周&#xff08;每周2次&#xff09;的观察记录&#xff0c;并根据参考书填写一级、三级、五级的评价指标。 去年中六班的时候&#xff0c;我很认真的手写了21周的户外游戏…

具有 Hudi、MinIO 和 HMS 的现代数据湖

Apache Hudi 已成为管理现代数据湖的领先开放表格式之一&#xff0c;直接在现代数据湖中提供核心仓库和数据库功能。这在很大程度上要归功于 Hudi 提供了表、事务、更新/删除、高级索引、流式摄取服务、数据聚类/压缩优化和并发控制等高级功能。 我们已经探讨了 MinIO 和 Hudi…

Vue3 - 在项目中使用vue-i18n不生效的问题

检查和配置 Vue I18n 确保你已经正确安装了Vue I18n并且配置了组合API模式。 安装 Vue I18n npm install vue-i18nnext配置 i18n.js import { createI18n } from vue-i18n; import messages from ./messages;const i18n createI18n({legacy: false, // 使用组合 API 模式l…

Linux检查端口nmap

yum install -y nmap # 查看本机在运行的服务的端口号 nmap 127.0.0.1 补充&#xff1a;netstat netstat -tunlp | grep 3306

读《文明之光》第2册总结

《文明之光》系列大致按照从地球诞生到近现代的顺序讲述了人类文明进程的各个阶段&#xff0c;每个章节相对独立&#xff0c;全景式地展现了人类文明发展历程中的多样性。《文明之光》系列第二册讲述了从近代科学兴起&#xff0c;到工业革命时代&#xff0c;以及原子能应用这一…

C++/Qt 小知识记录7

工作中遇到的一些小问题&#xff0c;总结的小知识记录&#xff1a;C/Qt 小知识7 编译FFMPEG遇到的问题CMakeLists.txt配置FFMPEG的依赖方式&#xff1a; x264在Windows下编译生成*.libVS编译Qt工程时&#xff0c;遇到提示Change Qt Version的情况在QtOsg的窗口上嵌入子窗口&…

基于JSP的交通事故档案管理系统

开头语&#xff1a;你好&#xff0c;我是计算机学长猫哥&#xff0c;如果你对系统有更多的期待或建议&#xff0c;欢迎随时联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPJava 工具&#xff1a;ECLIPSE、Tomcat 系统展示 首页 管理员界…

车辆数据的提取、定位和融合(其一 共十二篇)

第一篇&#xff1a; System Introduction 第二篇&#xff1a;State of the Art 第三篇&#xff1a;localization 第四篇&#xff1a;Submapping and temporal weighting 第五篇&#xff1a;Mapping of Point-shaped landmark data 第六篇&#xff1a;Clustering of landma…

Dockerfile实战

Dockerfile是用来快速创建自定义镜像的一种文本格式的配置文件&#xff0c;在持续集成和持续部署时&#xff0c;需要使用Dockerfile生成相关应用程序的镜像。 Dockerfile常用命令 FROM&#xff1a;继承基础镜像MAINTAINER&#xff1a;镜像制作作者的信息&#xff0c;已弃用&a…

文件管理—linux(基础IO)

目录 ​编辑 一、C语言文件接口&#xff08;库函数&#xff09; hello.c写文件 hello.c读文件 输出信息到显示器 stdin & stdout & stderr 二、系统文件I/O&#xff08;系统调用&#xff09; hello.c 写文件&#xff1a; hello.c读文件 接口介绍 open open…

JetBrains PhpStorm 2024 mac/win版:探索PHP之美,智慧编程新境界

JetBrains PhpStorm 2024是一款卓越的PHP集成开发环境(IDE)&#xff0c;专为满足现代PHP开发者的需求而精心打造。它凭借强大的功能和出色的性能&#xff0c;赢得了全球开发者的广泛赞誉。 PhpStorm 2024 mac/win版获取 PhpStorm 2024提供了智能的代码编辑功能&#xff0c;包括…

【TKGQA】关于时间知识图谱问答的一篇综述阅读

前言 时间知识图谱问答&#xff08;TKGQA&#xff09;是KBQA中一个关注时间问题的重要子任务。时间问题包含时间约束、需要时间标记的答案&#xff0c;反映了现实世界事件的动态和演变性质。 一、TKGQA 1.1 概述 时间知识图谱&#xff08;TKG&#xff09;&#xff1a; 通常表…

Android 添加自己的时钟小部件

小部件&#xff0c;也叫微件&#xff0c; 它的介绍参考官网 应用 widget 概览 https://developer.android.google.cn/develop/ui/views/appwidgets/overview?hlzh-cn 直接上图&#xff0c;原生系统上&#xff0c;时钟应用的小部件效果。 我也整一个。 1.创建小部件布局文…

tp5学习基本控制器和视图

1 文件结构 正在上传…重新上传取消 application 主要操作目录 extend 扩展 public 入口文件 runtime 运行时文件 thinkphp 核心代码 vendor 三方扩展 2 public/index.php 解析 正在上传…重新上传取消 .htaccess Apache 可写文件 index.php 主目录 router.php 路由文件 3 inde…