Java Web开发进阶——错误处理与日志管理

错误处理和日志管理是任何生产环境中不可或缺的一部分。在 Spring Boot 中,合理的错误处理机制不仅能够提升用户体验,还能帮助开发者快速定位问题;而有效的日志管理能够帮助团队监控应用运行状态,及时发现和解决问题。


1. 常见错误类型与处理机制
1.1 常见错误类型

在开发应用过程中,我们可能会遇到多种错误,常见的错误类型包括:

  • 运行时异常(RuntimeException):这种异常通常由程序中的逻辑错误导致,如空指针异常(NullPointerException)、数组下标越界(ArrayIndexOutOfBoundsException)等。
  • 受检异常(Checked Exception):这类异常通常是由外部因素引起的,如文件找不到(FileNotFoundException)、数据库连接失败(SQLException)等。开发者需要显式处理这类异常,或者通过 throws 抛出。
  • 错误(Error):通常表示虚拟机级别的错误,例如内存溢出(OutOfMemoryError)或栈溢出(StackOverflowError)等。
1.2 异常处理机制

在 Spring Boot 中,异常可以通过多种方式进行处理。常用的异常处理机制包括:

  • 局部异常处理:在方法中使用 try-catch 语句捕获并处理异常。这适用于一些局部的、不可避免的错误处理。
  • 全局异常处理:使用全局异常处理器(例如 @ControllerAdvice@ExceptionHandler)来统一处理不同类型的异常。这种方式适用于应用中需要统一处理异常的场景,简化了代码,增强了可维护性。

2. 全局异常处理与 @ResponseStatus
2.1 全局异常处理

Spring 提供了 @ControllerAdvice 注解,使我们能够将异常处理代码与业务逻辑分离,实现全局异常处理。@ControllerAdvice 类可以用来定义一个全局异常处理器,在捕获到异常时返回自定义的响应结果。

一个简单的全局异常处理示例如下:

import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseStatus;@ControllerAdvice
public class GlobalExceptionHandler {// 处理所有类型的异常@ExceptionHandler(Exception.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)public String handleException(Exception e, Model model) {model.addAttribute("error", e.getMessage());return "error";}// 处理特定的异常类型@ExceptionHandler(NullPointerException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)public String handleNullPointerException(NullPointerException e, Model model) {model.addAttribute("error", "Null Pointer Exception occurred");return "error";}
}

在上面的代码中,@ControllerAdvice 用来处理全局异常,@ExceptionHandler 用来指定处理特定异常的方法。@ResponseStatus 注解用于指定异常的 HTTP 响应状态码。

2.2 使用 @ResponseStatus 注解

@ResponseStatus 注解用于将异常与 HTTP 状态码绑定,可以方便地为特定的异常分配状态码,并自动返回对应的错误响应。

例如:

@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {public ResourceNotFoundException(String message) {super(message);}
}

ResourceNotFoundException 被抛出时,Spring 会自动将响应的状态码设置为 404 Not Found,并将异常消息作为响应体返回。

在实际应用中,我们可以通过 @ResponseStatus 为不同的异常类型指定不同的 HTTP 状态码,确保客户端可以获得更明确的错误信息。

2.3 其他常见异常处理机制
  • 自定义异常:我们可以定义自定义异常类,用于封装业务逻辑中的错误。例如:
public class BusinessException extends RuntimeException {public BusinessException(String message) {super(message);}
}

然后在全局异常处理类中处理这些自定义异常,返回自定义的错误消息。

  • RestController 异常处理:在 RESTful 风格的 Web 应用中,通常使用 @RestControllerAdvice 来集中管理异常。与 @ControllerAdvice 类似,它也可以捕获并处理应用中的异常,只不过它返回的是 JSON 格式的错误响应。
@RestControllerAdvice
public class GlobalRestExceptionHandler {@ExceptionHandler(ResourceNotFoundException.class)public ResponseEntity<ErrorResponse> handleResourceNotFoundException(ResourceNotFoundException ex) {ErrorResponse errorResponse = new ErrorResponse("Resource Not Found", ex.getMessage());return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);}
}

3. 使用SLF4J与Logback进行日志管理
3.1 SLF4J简介

SLF4J(Simple Logging Facade for Java)是一个日志门面,它为不同的日志系统(如 Log4j、Logback、JUL 等)提供统一的接口。SLF4J 本身不提供日志实现,它只提供 API,实际的日志输出是由底层实现(如 Logback)完成的。

在 Spring Boot 中,SLF4J 与 Logback 默认集成,因此我们可以直接使用 SLF4J API 进行日志记录。

3.2 Logback简介

Logback 是一个高效、灵活的日志框架,是 SLF4J 的原生实现,通常与 SLF4J 一起使用。它提供了丰富的功能,如日志级别控制、日志输出格式定制、日志文件轮转等。

Spring Boot 默认使用 Logback 作为日志框架,并且配置非常简单。我们可以通过 application.propertiesapplication.yml 文件来配置日志级别、日志文件路径等。

3.3 配置Logback日志

日志级别配置

通过 application.properties 配置文件设置日志级别,Spring Boot 默认日志级别为 INFO。可以通过以下方式修改日志级别:

# 设置根日志级别为 DEBUG
logging.level.root=DEBUG# 设置特定包的日志级别为 TRACE
logging.level.com.example=TRACE

日志文件输出配置

如果希望将日志输出到文件,可以在 application.properties 中进行如下配置:

# 设置日志输出文件
logging.file.name=app.log
logging.file.path=/var/logs

日志模式配置

Logback 提供了强大的配置功能,支持日志输出模式(如输出日志到控制台、文件或远程服务器)。以下是 Logback 的 XML 配置示例:

<configuration><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern></encoder></appender><root level="DEBUG"><appender-ref ref="CONSOLE"/></root>
</configuration>

这个配置文件指定了日志的输出格式,采用控制台输出,日志格式包括时间戳和日志消息。

3.4 使用 SLF4J 记录日志

在 Spring Boot 应用中,可以通过注入 Logger 对象来记录日志。常见的日志级别包括 DEBUGINFOWARNERRORTRACE

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;@Service
public class MyService {private static final Logger logger = LoggerFactory.getLogger(MyService.class);public void someMethod() {logger.debug("This is a debug message");logger.info("This is an info message");logger.error("This is an error message");}
}

在此示例中,我们使用 LoggerFactory 获取 Logger 对象,然后根据需要记录不同级别的日志。


总结

错误处理和日志管理是开发过程中非常重要的两个方面。在 Spring Boot 中,我们可以通过全局异常处理机制和自定义异常来简化错误处理的代码,并通过 SLF4J 和 Logback 实现高效的日志管理。通过合理的错误处理与日志管理,开发者可以更高效地监控应用状态、定位问题,并在发生错误时提供更友好的用户体验。

关于作者:

15年互联网开发、带过10-20人的团队,多次帮助公司从0到1完成项目开发,在TX等大厂都工作过。当下为退役状态,写此篇文章属个人爱好。本人开发期间收集了很多开发课程等资料,需要可联系我

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

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

相关文章

图解Git——分支的新建与合并《Pro Git》

⭐分支的新建与合并 先引入一个实际开发的工作流&#xff1a; 开发某个网站。为实现某个新的需求&#xff0c;创建一个分支。在这个分支上开展工作。 正在此时&#xff0c;你突然接到一个电话说有个很严重的问题需要紧急修补。你将按照如下方式来处理&#xff1a; 切换到你…

【数据可视化-12】数据分析岗位招聘分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

excel仅复制可见单元格,仅复制筛选后内容

背景 我们经常需要将内容分给不同的人&#xff0c;做完后需要合并 遇到情况如下 那是因为直接选择了整列&#xff0c;当然不可以了。 下面提供几种方法&#xff0c;应该都可以 直接选中要复制区域然后复制&#xff0c;不要选中最上面的列alt;选中可见单元格正常复制&#xff…

支持向量回归(SVR:Support Vector Regression)用于A股数据分析、预测

简单说明 支持向量回归是一种用来做预测的数学方法,属于「机器学习」的一种。 它的目标是找到一条「最合适的线」,能够大致描述数据点的趋势,并允许数据点离这条线有一定的误差(不要求所有点都完全落在这条线上)。 可以把它想象成:找到一条「宽带」或「隧道」,大部分…

LabVIEW水位监控系统

LabVIEW开发智能水位监控系统通过集成先进的传感技术与控制算法&#xff0c;为工业液体存储提供精确的水位调控&#xff0c;保证了生产过程的连续性与安全性。 项目背景 在化工和饮料生产等行业中&#xff0c;水位控制的准确性对保证生产安全和提高产品质量至关重要。传统的水…

深入浅出 Android AES 加密解密:从理论到实战

深入浅出 Android AES 加密解密&#xff1a;从理论到实战 在现代移动应用中&#xff0c;数据安全是不可忽视的一环。无论是用户隐私保护&#xff0c;还是敏感信息的存储与传输&#xff0c;加密技术都扮演着重要角色。本文将以 AES&#xff08;Advanced Encryption Standard&am…

React Fiber框架中的Render渲染阶段——workLoop(performUnitOfWork【beginWork与completeWork】)

触发渲染过程——renderRoot renderRoot 是一个函数&#xff0c;用于触发渲染工作。它通常会调用并递归地执行一系列的渲染任务&#xff0c;直到完成整个更新过程。这个过程包括执行 Fiber 树中的 beginWork 和 completeWork&#xff0c;以及渲染新状态或 DOM。 function ren…

【优先算法】思还故里闾,欲归道无因 - 前缀和

本篇博客给大家带来的是前缀和算法的知识点, 也是一样通过OJ题理解,掌握,应用该算法. &#x1f40e;文章专栏: 算法 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&…

亿道三防丨三防笔记本是什么意思?和普通笔记本的优势在哪里?

三防笔记本是什么意思&#xff1f;和普通笔记本的优势在哪里&#xff1f; 在现代社会中&#xff0c;笔记本电脑已经成为人们工作和生活中不可或缺的一部分。然而&#xff0c;在一些特殊行业或环境中&#xff0c;普通笔记本电脑由于其脆弱性和对环境条件的敏感性&#xff0c;往…

SOME/IP 协议详解——服务发现

文章目录 1. Introduction &#xff08;引言&#xff09;2. SOME/IP Service Discovery (SOME/IP-SD)2.1 General&#xff08;概述)2.2 SOME/IP-SD Message Format2.2.1 通用要求2.2.2 SOME/IP-SD Header2.2.3 Entry Format2.2.4 Options Format2.2.4.1 配置选项&#xff08;Co…

Go语言之路————go环境的初始化

Go语言之路————go环境的初始化 前言一、Go的安装二、环境配置三、初始化一个新项目四、常用的一些指令 前言 我是一名多年Java开发人员&#xff0c;因为工作需要现在要学习go语言&#xff0c;Go语言之路是一个系列&#xff0c;记录着我从0开始接触Go&#xff0c;到后面能正…

鸿蒙UI开发——基于onTouch事件实现表情选择胶囊

1、背 景 有朋友留言说&#xff0c;抖音APP中&#xff0c;长按评论按钮触发的快捷表情选择胶囊动画比较好&#xff08;效果如下图&#xff09;&#xff0c;希望使用鸿蒙ArkTs也实现一个类似的。 本文在鸿蒙ArkTs下也实现一个类似的效果&#xff0c;如下&#xff1a; 首先&…

Node.js——http 模块(二)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

研华 PCI-1751 驱动更新导LabVIEW致程序异常

问题描述&#xff1a; 某 LabVIEW 程序长期运行正常&#xff0c;但在使用研华 PCI-1751 数据采集卡运行一段时间后&#xff0c;程序开始出现不正常的行为。具体过程如下&#xff1a; 初始问题&#xff1a; 更换新的 PCI-1751 板卡后&#xff0c;驱动程序被更新&#xff0c;但程…

接上篇基于Alertmanager 配置钉钉告警

Alertmanager 是一个用于处理和管理 Prometheus 警报的开源工具。它负责接收来自 Prometheus 服务器的警报&#xff0c;进行去重、分组、静默、抑制等操作&#xff0c;并通过电子邮件、PagerDuty、Slack 等多种渠道发送通知。 主要功能 去重&#xff1a;合并相同或相似的警报&…

网络原理(三)—— 传输层 之 UDP 和 TCP协议

传输层 在传输层两大关键的协议就是UDP和TCP协议了&#xff0c;除此之外&#xff0c;还有别的传输层协议&#xff0c;本文章将介绍UDP和TCP协议&#xff0c;重点介绍TCP协议。 首先回顾TCP和UDP 的特点&#xff1a; UDP&#xff1a;不可靠传输&#xff0c;面向数据包&#xf…

针对服务器磁盘爆满,MySql数据库始终无法启动,怎么解决

&#xff08;点击即可进入聊天助手&#xff09; 很多站长在运营网站的过程当中都会遇到一个问题,就是网站突然无法打开,数据一直无法启动 无论是强制重启还是,删除网站内的所有应用,数据库一直无法启动 这个时候,就需要常见的运维手段了,需要对服务器后台各个资源,进行逐一排查…

高性能现代PHP全栈框架 Spiral

概述 Spiral Framework 诞生于现实世界的软件开发项目是一个现代 PHP 框架&#xff0c;旨在为更快、更清洁、更卓越的软件开发提供动力。 特性 高性能 由于其设计以及复杂精密的应用服务器&#xff0c;Spiral Framework框架在不影响代码质量以及与常用库的兼容性的情况下&a…

【STM32-学习笔记-6-】DMA

文章目录 DMAⅠ、DMA框图Ⅱ、DMA基本结构Ⅲ、不同外设的DMA请求Ⅳ、DMA函数Ⅴ、DMA_InitTypeDef结构体参数①、DMA_PeripheralBaseAddr②、DMA_PeripheralDataSize③、DMA_PeripheralInc④、DMA_MemoryBaseAddr⑤、DMA_MemoryDataSize⑥、DMA_MemoryInc⑦、DMA_DIR⑧、DMA_Buff…

SQL Server中可以通过扩展事件来自动抓取阻塞

在SQL Server中可以通过扩展事件来自动抓取阻塞&#xff0c;以下是详细流程&#xff1a; 开启阻塞跟踪配置&#xff1a; • 执行以下SQL语句来启用相关配置&#xff1a; EXEC sp_configureshow advanced options, 1; RECONFIGURE; EXEC sp_configure blocked process thresh…