当前位置: 首页 > news >正文

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等大厂都工作过。当下为退役状态,写此篇文章属个人爱好。本人开发期间收集了很多开发课程等资料,需要可联系我

相关文章:

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

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

计算机网络 笔记 网络层1

网络层功能概述 主要的任务是把分组从源端传输到目的端&#xff0c;为分组交换网上的不同主句提供通信服务&#xff0c;网络层的传输单位是数据报。 主要的功能&#xff1b; 1&#xff0c;路由选择&#xff1a;路由选择指网络层根据特定算法&#xff0c;为数据包从源节点到目…...

【论文笔记】多个大规模数据集上的SOTA绝对位姿回归方法:Reloc3r

abstract 视觉定位旨在确定查询图像相对于姿势图像数据库的相机姿势。 近年来&#xff0c;直接回归相机姿势的深度神经网络由于其快速推理能力而受到欢迎。 然而&#xff0c;现有方法很难很好地推广到新场景或提供准确的相机姿态估计。 为了解决这些问题&#xff0c;我们提出了…...

springMVC---常用注解

目录 一、创建项目 1.依赖 2.web.xml 3.spring-mvc.xml 二、RequestParam注解 1.作用 2.属性 3.代码 DeptController类 启动tomcat 三、RequestBody注解 1.作用 2.属性 3.代码 (1&#xff09;DeptController类 (2&#xff09;index.jsp (3)启动tomcat 四、P…...

青龙面板脚本开发指南:高效自动化任务的实现

青龙面板脚本开发指南&#xff1a;高效自动化任务的实现 青龙面板&#xff08;Qinglong Panel&#xff09;是一款强大的任务管理平台&#xff0c;支持多种语言的脚本开发和执行。通过在青龙面板中编写和管理脚本&#xff0c;用户可以轻松实现自动化任务&#xff0c;提高工作效…...

深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理

DICOM医学影像中的定位线(Localization Line) 在医学影像学中,DICOM是用于存储和交换医学影像的标准格式。定位线(Localization Line)在医学影像的显示和分析中起着重要作用,它帮助医生和医学专业人员在影像中精确地标定重要的解剖结构、区域或特征,辅助进行定位、治疗计…...

网络应用技术 实验七:实现无线局域网

一、实验简介 在 eNSP 中构建无线局域网&#xff0c;并实现全网移动终端互相通信。 二、实验目的 1 、理解无线局域网的工作原理&#xff1b; 2 、熟悉无线局域网的规划与构建过程&#xff1b; 3 、掌握无线局域网的配置方法&#xff1b; 三、实验学时 2 学时 四、实…...

kubeneters-循序渐进Cilium网络(一)

文章目录 概要传统网络不同的网络&#xff08;或子网&#xff09;之间通信Kubernetes 中的网络在同一栋大楼内的公寓之间通信跨大楼的通信总结 概要 本文通过“封包追踪”方法&#xff0c;深入解析 Kubernetes 网络通信过程。基于 eBPF 的 Cilium 工具&#xff0c;直观展示了数…...

elasticsearch中IK分词器

1、什么是IK分词器 ElasticSearch 几种常用分词器如下&#xff1a; 分词器分词方式StandardAnalyzer单字分词CJKAnalyzer二分法IKAnalyzer词库分词 分词∶即把一段中文或者别的划分成一个个的关键字&#xff0c;我们在搜索时候会把自己的信息进行分词&#xff0c;会把数据库…...

Qt之http客户端类

一、HTTP客户端类功能&#xff1a; 1、POST请求发送&#xff1a; 支持发送JSON格式的数据自动处理请求头设置提供上传进度监控、 2、GET请求发送&#xff1a; 简单的GET请求实现支持下载进度监控 3、状态监控&#xff1a; 通过信号槽机制监控上传/下载进度错误处理和状态回调 /…...

18.C语言文件操作详解:指针、打开、读取与写入

目录 1.文件指针2.fopen3.标准流4.fclose5.EOF6.freopen()7.fgetc与getc8. fputc与putc9.fprintf10.fscanf11.fgets12.fputs13.fwrite14.fread15.feof16.fseek17.ftell18.rewind19.fgetpos()与fsetpos20.ferror与clearerr21.remove22.rename 1.文件指针 本篇原文为&#xff1a…...

深入浅出 OpenResty

1. 引言 1.1. OpenResty简介 OpenResty 是一个基于 Nginx 的高性能 Web 平台&#xff0c;它集成了大量模块&#xff0c;并原生支持 Lua 脚本。这使得开发者能够以非常灵活的方式实现复杂的逻辑&#xff0c;而无需重新编译或扩展 Nginx 核心。OpenResty 的主要特点包括&#x…...

在 .NET 9 中使用 Scalar 替代 Swagger

前言 在.NET 9发布以后ASP.NET Core官方团队发布公告已经将Swashbuckle.AspNetCore&#xff08;一个为ASP.NET Core API提供Swagger工具的项目&#xff09;从ASP.NET Core Web API模板中移除&#xff0c;这意味着以后我们创建Web API项目的时候不会再自动生成Swagger API文档了…...

ue5 蒙太奇,即上半身动画和下半身组合在一起,并使用。学习b站库得科技

本文核心 正常跑步动画端枪动画跑起来也端枪 正常跑步动画 端枪动画的上半身 跑起来也端枪 三步走&#xff1a; 第一步制作动画蒙太奇和插槽 第二步动画蓝图选择使用上半身动画还是全身动画&#xff0c;将上半身端枪和下半身走路结合 第三步使用动画蒙太奇 1.开始把&a…...

多活架构的实现原理与应用场景解析

一、多活架构为何如此重要? 企业的业务运营与各类线上服务紧密相连,从日常的购物消费、社交娱乐,到金融交易、在线教育等关键领域,无一不依赖于稳定可靠的信息系统。多活架构的重要性愈发凸显,它宛如一位忠诚的卫士,为业务的平稳运行保驾护航。 回想那些因系统故障引发的…...

一 rk3568 Android 11固件开发环境搭建 (docker)

一 目标 搭建 rk3568 android 系统内核 及固件开发编译调试环境, 支持开发环境导出分享 基于荣品 rk3568 核心板 系统环境: ubuntu22.04 /ubuntu20.04 64位桌面版 编译环境: docker + ubuntu20.04 , 独立的容器隔离环境,不受系统库版本冲突等影响,无性能损耗, 可…...

小结:华为路由器常用的操作指令

以下是华为路由器常用的操作指令&#xff08;适用于华为企业级路由器&#xff0c;基于VRP操作系统&#xff09;&#xff1a; 1. 基本操作命令 进入用户视图模式 <Huawei> &#xff08;默认进入用户视图&#xff09; 进入系统视图模式 <Huawei> system-view [Huawe…...

旅游网站设计与实现

文末附有完整项目代码 在当今数字化时代&#xff0c;旅游网站成为人们获取旅游信息的重要途径。本文将详细介绍旅游网站的设计与实现&#xff0c;让你轻松了解其中的技术奥秘&#xff01; 一、项目背景 随着社会经济的发展&#xff0c;人们对精神消费愈发重视&#xff0c;旅游…...

【AI大模型】BERT GPT ELMo模型的对比

目录 &#x1f354; BERT, GPT, ELMo之间的不同点 &#x1f354; BERT, GPT, ELMo各自的优点和缺点 &#x1f354; 小结 学习目标 理解BERT, GPT, ELMo相互间的不同点理解BERT, GPT, ELMo相互比较下的各自优点和缺点 &#x1f354; BERT, GPT, ELMo之间的不同点 关于特征提取…...

qt 快捷功能 快速生成 setter getter 构造函数 父类虚函数重写 成员函数实现 代码框架 查看父类及父类中的虚函数

qt 快速生成 setter getter 构造函数 父类虚函数重写 成员函数实现 代码框架 1、找到要实现的头文件 2、鼠标移动到在头文件中的类定义的类名上&#xff0c;右键进行选择。 这是插入父类虚函数(父类虚函数重写) 选项弹出来的结果。可以查看到所有父类及父类中的所有的虚函数...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...