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

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

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

相关文章

二分查找算法——山脉数组的峰顶索引

一.题目描述 852. 山脉数组的峰顶索引 - 力扣&#xff08;LeetCode&#xff09; 二.题目解析 题目给了我们一个山脉数组&#xff0c;山脉数组的值分布就如下面的样子&#xff1a; 然后我们只需要返回数组的峰值元素的下标即可。 三.算法原理 1.暴力解法 因为题目明确说明…

2. Doris数据导入与导出

一. Doris数据导入 导入方式使用场景支持的文件格式导入模式Stream Load导入本地文件或者应用程序写入csv、json、parquet、orc同步Broker Load从对象存储、HDFS等导入csv、json、parquet、orc异步Routine Load从kakfa实时导入csv、json异步 1. Stream Load 基本原理 在使用…

30_Redis哨兵模式

在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中,不仅需要人为干预,而且还会造成一段时间内服务器处于不可用状态,同时数据安全性也得不到保障,因此主从模式的可用性…

把PX4及子仓库添加到自己的gitee

导入主仓库 此处以导入PX4为例 先用gitee导入仓库然后clone gitee仓库先checkout到v1.11&#xff0c;git submodule update --init --recursive&#xff0c;确保可以make之后再新建branchgit checkout -b my1.11.0按照提示连接到origin改代码然后三件套就行了git add ./*git …

解决:ubuntu22.04中IsaacGymEnv保存视频报错的问题

1. IsaacGymEnvs项目介绍 IsaacGymEnvs&#xff1a;基于NVIDIA Isaac Gym的高效机器人训练环境 IsaacGymEnvs 是一个基于 NVIDIA Isaac Gym 的开源 Python 环境库&#xff0c;专为机器人训练提供高效的仿真环境。Isaac Gym 是由 NVIDIA 开发的一个高性能物理仿真引擎&#xf…

ELK日志分析实战宝典之ElasticSearch从入门到服务器部署与应用

目录 ELK工作原理展示图 一、ElasticSearch介绍&#xff08;数据搜索和分析&#xff09; 1.1、特点 1.2、数据组织方式 1.3、特点和优势 1.3.1、分布式架构 1.3.2、强大的搜索功能 1.3.3、数据处理与分析 1.3.4、多数据类型支持 1.3.5、易用性与生态系统 1.3.6、高性…

android 自定义SwitchCompat,Radiobutton,SeekBar样式

纯代码的笔记记录。 自定义SwitchCompat按钮的样式 先自定义中间的圆球switch_thumb_bg.xml <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android"android:shape"oval&q…

【学习路线】Python自动化运维 详细知识点学习路径(附学习资源)

学习本路线内容之前&#xff0c;请先学习Python的基础知识 其他路线&#xff1a; Python基础 >> Python进阶 >> Python爬虫 >> Python数据分析&#xff08;数据科学&#xff09; >> Python 算法&#xff08;人工智能&#xff09; >> Pyth…

【URDF和SDF区别】

URDF&#xff08;Unified Robot Description Format&#xff0c;统一机器人描述格式&#xff09;和SDF&#xff08;Simulation Description Format&#xff0c;仿真描述格式&#xff09;是两种常用的机器人和仿真环境建模格式。虽然它们在许多方面有相似之处&#xff0c;但也存…

【翻译】2025年华数杯国际赛数学建模题目+翻译pdf自取

保存至本地网盘 链接&#xff1a;https://pan.quark.cn/s/f82a1fa7ed87 提取码&#xff1a;6UUw 2025年“华数杯”国际大学生数学建模竞赛比赛时间于2025年1月11日&#xff08;周六&#xff09;06:00开始&#xff0c;至1月15日&#xff08;周三&#xff09;09:00结束&#xff…

springboot vue uniapp 仿小红书 1:1 还原 (含源码演示)

线上预览: 移动端 http://8.146.211.120:8081/ 管理端 http://8.146.211.120:8088/ 小红书凭借优秀的产品体验 和超高人气 目前成为笔记类产品佼佼者 此项目将详细介绍如何使用Vue.js和Spring Boot 集合uniapp 开发一个仿小红书应用&#xff0c;凭借uniapp 可以在h5 小程序 app…

VS2015 + OpenCV + OnnxRuntime-Cpp + YOLOv8 部署

近期有个工作需求是进行 YOLOv8 模型的 C 部署&#xff0c;部署环境如下 系统&#xff1a;WindowsIDE&#xff1a;VS2015语言&#xff1a;COpenCV 4.5.0OnnxRuntime 1.15.1 0. 预训练模型保存为 .onnx 格式 假设已经有使用 ultralytics 库训练并保存为 .pt 格式的 YOLOv8 模型…

css盒子水平垂直居中

目录 1采用flex弹性布局&#xff1a; 2子绝父相margin&#xff1a;负值&#xff1a; 3.子绝父相margin:auto&#xff1a; 4子绝父相transform&#xff1a; 5通过伪元素 6table布局 7grid弹性布局 文字 水平垂直居中链接&#xff1a;文字水平垂直居中-CSDN博客 以下为盒子…

qt QPainter setViewport setWindow viewport window

使用qt版本5.15.2 引入viewport和window目的是用于实现QPainter画出来的内容随着窗体伸缩与不伸缩两种情况&#xff0c;以及让QPainter在widget上指定的区域(viewport)进行绘制/渲染&#xff08;分别对应下方demo1&#xff0c;demo2&#xff0c;demo3&#xff09;。 setViewpo…

深度学习-算法优化与宇宙能量梯度分布

在当今迅速发展的科技世界中&#xff0c;算法优化和能量分布问题已成为研究的热点&#xff0c;尤其是在人工智能、机器学习和物理科学领域。算法优化通常涉及提高计算效率和降低资源消耗&#xff0c;而宇宙能量梯度分布则涉及宇宙中能量的分布和流动方式。两者看似是完全不同的…

Linux驱动学习之第三个驱动程序(两个按键的驱动程序-读取按键值)

程序框架说明(和之前的LED驱动进行对比) 这个程序的框架与之前学习的第二个驱动程序(控制LED)的框架基本一致&#xff0c;第二个驱动程序的链接如下&#xff1a; https://blog.csdn.net/wenhao_ir/article/details/144973219 所以如果前两这个LED驱动程序的框架掌握得很清楚了…

KMP前缀表 ≈ find() 函数——28.找出字符串中第一个匹配项的下标【力扣】

class Solution { public: //得到前缀表void getNext(int *next,string needle){int j0;for(int i1;i<needle.size();i){while(j>0 && needle[j]!needle[i]) jnext[j-1];//**j>0**>j0是出口if(needle[i]needle[j]) j;next[i]j;//若写入if中&#xff0c;则该…

vulnhub靶场【IA系列】之Tornado

前言 靶机&#xff1a;IA-Tornado&#xff0c;IP地址为192.168.10.11 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.2 都采用虚拟机&#xff0c;网卡为桥接模式 本文所用靶场、kali镜像以及相关工具&#xff0c;我放置在网盘中&#xff0c;可以复制后面链接查看 htt…

【优选算法篇】:模拟算法的力量--解决复杂问题的新视角

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;优选算法篇–CSDN博客 文章目录 一.模拟算法二.例题1.替换所有的问号2.提莫攻击3.外观数列4…

云集电商:数据库的分布式升级实践|OceanBase案例

电商行业对数据库有哪些需求 云集电商作为一家传统电商企业&#xff0c;业务涵盖了美妆个护、服饰、水果生鲜、健康保健等多个领域&#xff0c;在创立四年后在纳斯达克上市&#xff08;股票代码&#xff1a;YJ&#xff09;。与京东、淘宝、拼多多等电商平台不同&#xff0c;云…