异常课后作业2

news/2025/11/5 20:37:51/文章来源:https://www.cnblogs.com/lgsyf/p/19194571

Java项目中常用异常处理场景与实践总结

在Java项目开发中,异常处理是保障程序健壮性、可维护性的关键环节。合理的异常处理不仅能避免程序崩溃,还能为问题排查、用户体验优化提供有力支撑。本文将围绕Java项目中常见的异常场景,从异常分类、处理策略、实战案例等维度展开分析,帮助开发者构建完善的异常处理体系。

一、Java异常的分类与核心概念

Java异常体系以Throwable为顶层类,分为Error(系统级错误,如OutOfMemoryError,通常无需捕获)和Exception两大类。Exception又分为受检异常(需显式处理,如IOException)和非受检异常(运行时异常,如NullPointerException,可选择性处理)。

异常类型 示例 处理要求
受检异常 IOException 必须try-catch或throws
非受检异常 NullPointerException 可选择性处理
Error StackOverflowError 一般不处理,属于系统级故障

二、Web项目中的典型异常处理场景

1. 接口请求与参数校验异常

在Spring Boot等Web框架中,接口参数校验是异常高发区。例如:

@RestController
public class UserController {@PostMapping("/user")public Result<User> createUser(@Valid @RequestBody UserDTO dto) {// 业务逻辑}
}// UserDTO中参数校验注解
public class UserDTO {@NotNull(message = "用户名不能为空")private String username;@Pattern(regexp = "^\\d{11}$", message = "手机号格式错误")private String phone;
}

当参数不满足校验规则时,会抛出MethodArgumentNotValidException。可通过全局异常处理器统一处理:

@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public Result<String> handleValidationException(MethodArgumentNotValidException e) {String errorMsg = e.getBindingResult().getFieldError().getDefaultMessage();return Result.fail(errorMsg);}
}

2. 数据库操作异常

数据库交互中常见SQLException(如主键冲突、连接超时)、MyBatis的PersistenceException等。以MyBatis为例,处理SQL执行异常:

@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic User getUserById(Long id) {try {return userMapper.selectById(id);} catch (PersistenceException e) {log.error("数据库查询用户异常,id:{}", id, e);throw new BusinessException("用户查询失败,请稍后重试");}}
}

这里将框架异常封装为自定义业务异常,避免暴露底层实现细节。

3. 文件操作异常

文件上传、下载、读取时,IOException(如文件不存在、权限不足)频发。示例:

public class FileService {public void uploadFile(MultipartFile file) {try {String filePath = "/upload/" + file.getOriginalFilename();file.transferTo(new File(filePath));} catch (IOException e) {log.error("文件上传失败", e);throw new FileOperationException("文件上传异常,请检查文件大小与格式");}}
}

三、业务层自定义异常与统一处理

在复杂业务场景中,自定义异常能更精准地表达业务规则冲突。例如:

// 自定义业务异常
public class BusinessException extends RuntimeException {private Integer code;public BusinessException(Integer code, String message) {super(message);this.code = code;}// getter方法
}// 业务场景中使用
public class OrderService {public void createOrder(OrderDTO dto) {if (dto.getAmount() <= 0) {throw new BusinessException(400, "订单金额必须大于0");}// 其他业务逻辑}
}// 全局异常处理器统一拦截
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(BusinessException.class)public Result<String> handleBusinessException(BusinessException e) {return Result.fail(e.getCode(), e.getMessage());}
}

四、异常处理的最佳实践

1. 分层职责明确

  • 控制层(Controller):负责接收请求、参数校验,捕获并转换异常为统一响应格式。
  • 服务层(Service):处理业务逻辑,抛出自定义业务异常。
  • 持久层(DAO):封装数据库异常,向上层传递业务语义的异常。

2. 日志记录精准

异常发生时,需记录足够的上下文信息(如请求参数、用户ID、操作时间等),便于问题追溯:

try {// 业务逻辑
} catch (Exception e) {log.error("用户{}执行{}操作失败,参数:{}", userId, operation, JSON.toJSONString(params), e);throw new BusinessException("操作失败,请稍后重试");
}

3. 避免过度捕获

不要盲目使用catch (Exception e)捕获所有异常,应针对性捕获具体异常类型,防止隐藏真正的问题。

4. finally与资源关闭

涉及IO流、数据库连接等资源时,务必在finally中关闭资源,或使用Java 7+的try-with-resources语法(自动关闭资源):

try (FileInputStream fis = new FileInputStream("file.txt")) {// 读取文件
} catch (IOException e) {log.error("文件读取异常", e);
}

五、常见异常处理误区

1. 捕获异常后无动作

// 错误示例:捕获异常后不处理,也不抛出
try {// 业务逻辑
} catch (Exception e) {// 空逻辑,问题被隐藏
}

2. 异常信息泄露

生产环境中,不要将原始异常堆栈直接返回给前端,需转换为友好的提示信息,避免暴露系统实现细节。

3. 递归调用未处理栈溢出

递归逻辑中需设置终止条件,否则可能触发StackOverflowError,且该错误无法通过常规try-catch捕获。

六、总结

Java异常处理是一项需要结合技术与业务的工程实践。通过合理分类异常、分层处理、自定义业务异常、遵循最佳实践,能有效提升系统的健壮性与可维护性。在实际项目中,需根据业务复杂度灵活调整异常处理策略,既保证问题可追溯,又能为用户提供友好的交互体验,最终构建出稳定、可靠的Java应用。

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

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

相关文章

日总结 22

nvm(Node Version Manager)是一款轻量实用的 Node.js 版本管理工具,支持在同一设备上安装、卸载多个不同版本的 Node.js,可快速切换版本以适配不同项目的依赖需求,无需手动配置安装路径,能有效解决多项目开发中 …

Nlog配置文件nlog.config (.net core 6)

<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&quo…

重组抗体:从 “天然提取” 到 “基因定制”,抗体技术如何改写生物医药格局?

提到 “抗体”,你可能会想到疫苗接种后身体产生的 “免疫卫士”—— 但在科研、诊断和治疗中,我们需要的往往是 “精准可控” 的抗体。传统抗体(如多克隆抗体、杂交瘤单克隆抗体)要么特异性差、要么生产不稳定,而…

2025年主流数据分类分级工具全面对比与选型指南

2025年主流数据分类分级工具全面对比与选型指南在数据安全法规日益严格的2025年,企业选择合适的数据分类分级工具已成为合规运营和风险管控的核心环节。本文从实际选型需求出发,通过六大关键维度深度对比市场主流产品…

Http协议解析

一、概述 超文本传输协议(Hyper Text Transfer Protocol,简称HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。 1.1 发展历史起源:HTTP的发展是由蒂姆伯纳斯-李于1989…

大模型应用开发技术路线(下):智能代理与多模态应用开发指南

本文系统阐述智能代理与多模态应用的开发技术,从架构设计到实战落地,涵盖智能代理的四大设计模式与四步开发法,多模态应用的模型选择与模态融合策略,并总结五大常见陷阱及解决方案,助力开发者构建自主可控、自然高…

NOIP 2024 T4 树上查询 小结

这个也是写给自己看的。 首先可以看每一种答案取到的范围。 然后就是两个区间求交的长度会大于等于 k。 这个比较好求。 稍微有点难的部分就是他的答案区间被我的目标区间包含。 这个我一开始在考场上写的是 cdq,然后…

高性能计算-CUDA-mma PTX 指令行为分析

1. 介绍:PTX 指令集中 WMMA 矩阵计算从共享内存加载数据到 fragment 片段使用的封装API是 load__matrix_sync,其底层 PTX指令与mma 一致,并且 fragment 布局一致。本文介绍底层 ldamatrix、stmatrix 指令的行为,并…

NOIP 2022 T3 建造军营 小结

写给自己看的。 这个题比 T2 简单多了。 就是你显然考虑缩点。 缩完之后就变成了一棵树。 那么对于这棵树你就可以进行 dp 了。 设 \(f_{i,0/1}\) 表示 \(i\) 子树内是否有军营。 转移还是比较好写的。 就是要预处理出…

英语_阅读_Digital classroom_待读

Education has undergone significant changes over the past century. 教育在过去的一个世纪中经历了重大的变革。 In the past, traditional education was the norm, with students sitting in classrooms and lear…

2025.11.5——1绿1蓝

普及+/提高 P12501 「ROI 2025 Day1」奥林匹克楼梯 赛时T1,单调队列优化DP 提高+/省选- P11795 [JOI 2016 Final] 铁路票价 / Train Fare 图论的问题,我的舒适区。

PhotoShop网页版(在线ps)在快速修复老照片,在线修旧如新

每个人的家里可能都藏着几张泛黄或折痕斑驳的老照片,这些照片承载着我们宝贵的回忆。然而,随着时间流逝,照片 inevitable 地被岁月侵蚀,有的已经模糊不清。如何让这些珍贵的旧照片焕发新生?如果你不会复杂的修图技…

CSP - S 2025 游记

总分:100+64+0+12=176 在 Print 之前 这篇游记考虑了很久,在成绩出来前,都不敢说自己能拿多少。 本来考完就快崩了,晕了两天,一直以为会挂到 128。 Day 0 无所事事。 因为要办考点,中午就放了,回家看了会儿知乎…

Revive Adserver SQL注入漏洞分析:关键词参数引发的数据库安全风险

本文详细分析了Revive Adserver v6.0.0中存在的SQL注入漏洞,该漏洞位于admin-search.php文件的关键词参数处理中,攻击者可通过错误注入和时间盲注技术获取完整数据库访问权限,文章包含技术分析、复现步骤和修复方案…

2025年插座厂家权威推荐榜:耳机插座,DC插座,防水耳机插座,专业品质与安全性能深度解析

2025年插座厂家权威推荐榜:耳机插座,DC插座,防水耳机插座,专业品质与安全性能深度解析 随着智能终端设备的快速普及和物联网技术的深入应用,插座作为电子设备中不可或缺的连接组件,其技术标准与性能要求正在经历…

2025 年 11 月硅锰合金厂家推荐排行榜,硅锰合金颗粒,硅锰合金粉,高碳硅锰合金,低碳硅锰合金公司推荐

2025 年 11 月硅锰合金厂家推荐排行榜:硅锰合金颗粒、硅锰合金粉、高碳硅锰合金、低碳硅锰合金公司推荐 一、行业背景与发展现状 硅锰合金作为钢铁冶炼中不可或缺的脱氧剂和合金添加剂,在冶金工业中占据重要地位。随…

2025年轻触开关厂家推荐排行榜,检测开关,按键开关,微动开关,防水开关源头厂家最新权威精选

2025年轻触开关厂家推荐排行榜,检测开关,按键开关,微动开关,防水开关源头厂家最新权威精选 在工业自动化、消费电子和智能家居快速发展的今天,开关作为基础电子元器件的重要性日益凸显。从家电控制到工业设备,从…

2025年连接器厂家推荐排行榜,USB连接器,电池连接器,TYPE-C连接器,防水TYPE-C连接器,防水USB连接器公司精选

2025年连接器厂家推荐排行榜:USB连接器、电池连接器、TYPE-C连接器、防水TYPE-C连接器、防水USB连接器公司精选 随着电子设备向智能化、便携化、多功能化方向发展,连接器作为电子设备中不可或缺的关键组件,其技术要…

[KaibaMath]1019 关于收敛数列拉链定理的证明

数列收敛于a的充要条件是该数列的两个互补子列(通常取奇数项子列和偶数项子列)都收敛于同一个极限a. 该定理被称为拉链定理,下面给出相应的证明.

zMWVIFEk0nKBm5kxQFHLdNaPTtQ=

这是郑州西亚斯学院智能体创新大赛的示例文件,如果你看到这个信息,说明这个文件的内容已经正常发送。