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

news2025/1/14 16:51:42

错误处理和日志管理是任何生产环境中不可或缺的一部分。在 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.coloradmin.cn/o/2276565.html

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

相关文章

《零基础Go语言算法实战》【题目 2-25】goroutine 的执行权问题

《零基础Go语言算法实战》 【题目 2-25】goroutine 的执行权问题 请说明以下这段代码为什么会卡死。 package main import ( "fmt" "runtime" ) func main() { var i byte go func() { for i 0; i < 255; i { } }() fmt.Println("start&quo…

Ubuntu系统Qt的下载、安装及入门使用,图文详细,内容全面

文章目录 说明1 在线安装2 离线安装3 使用Qt Creator创建Qt应用程序并构建运行补充补充一&#xff1a;注册Qt账号 说明 本文讲解Ubuntu系统下安装Qt&#xff0c;包括在线安装和离线安装两种方式&#xff0c;内容充实细致&#xff0c;话多但是没有多余&#xff08;不要嫌我啰嗦…

线形回归与小批量梯度下降实例

1、准备数据集 import numpy as np import matplotlib.pyplot as pltfrom torch.utils.data import DataLoader from torch.utils.data import TensorDataset######################################################################### #################准备若干个随机的x和…

P3884 [JLOI2009] 二叉树问题

题目描述&#xff1a; 如下图所示的一棵二叉树的深度、宽度及结点间距离分别为&#xff1a; - 深度&#xff1a;4 - 宽度&#xff1a;4 - 结点 8 和 6 之间的距离&#xff1a;8 - 结点 7 和 6 之间的距离&#xff1a;3 其中宽度表示二叉树上同一层最多的结点个数&#xff0c;节…

ssm旅游攻略网站设计+jsp

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 需要源码或者定制看文章最下面或看我的主页 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2 目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 2.1 SSM框架介绍 3 2.2 B/S结构介绍 3 …

Qt类的提升(Python)

from PyQt5.QtWidgets import QPushButtonclass apushbutton(QPushButton):def __init__(self, parentNone):super().__init__(parent)self.setText("Custom Button")self.setStyleSheet("background-color: yellow;")上述为一个“模板类”&#xff0c;命名…

kubernetes上安装kubesphere

准备工作 需要配置三台虚拟机 关闭防火墙 systemctl stop firewalldsystemctl disable firewalld 临时关闭selinux setenforce 0 永久关闭selinux vi /etc/selinux/config 安装docker rpm -qa|grep docker yum remove docker* -y rpm -qa|grep docker yum install -y yum-u…

Windows图形界面(GUI)-QT-C/C++ - QT控件创建管理初始化

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 控件创建 包含对应控件类型头文件 实例化控件类对象 控件设置 设置父控件 设置窗口标题 设置控件大小 设置控件坐标 设置文本颜色和背景颜色 控件排版 垂直布局 QVBoxLayout …

分页工具代码重构

文章目录 1.common-mybatis-plus-starter1.目录2.PageInfo.java3.PageResult.java4.SunPageHelper.java 1.common-mybatis-plus-starter 1.目录 2.PageInfo.java package com.sunxiansheng.mybatis.plus.page;import lombok.EqualsAndHashCode; import lombok.ToString;impor…

Vue学习二——创建登录页面

前言 以一个登录页面为例子&#xff0c;这篇文章简单介绍了vue&#xff0c;element-plus的一些组件使用&#xff0c;vue-router页面跳转&#xff0c;pinia及持久化存储&#xff0c;axios发送请求的使用。后面的页面都大差不差&#xff0c;也都这么实现&#xff0c;只是内容&am…

初始Django框架

初识Django Python知识点&#xff1a;函数、面向对象。前端开发&#xff1a;HTML、CSS、JavaScript、jQuery、BootStrap。MySQL数据库。Python的Web框架&#xff1a; Flask&#xff0c;自身短小精悍 第三方组件。Django&#xff0c;内部已集成了很多组件 第三方组件。【主要…

深度学习每周学习总结R4(LSTM-实现糖尿病探索与预测)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客R6中的内容&#xff0c;为了便于自己整理总结起名为R4&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. LSTM介绍LSTM的基本组成部分如何理解与应用LSTM 2. 数据预处理3. 数…

虚假星标:GitHub上的“刷星”乱象与应对之道

在开源软件的世界里&#xff0c;GitHub无疑是最重要的平台之一。它不仅是一个代码托管平台&#xff0c;也是一个社交网络&#xff0c;允许开发者通过“点赞”&#xff08;即加星&#xff09;来表达对某个项目的喜爱和支持&#xff0c;“星标”&#xff08;Star&#xff09;则成…

前端笔记----

在我的理解里边一切做页面的代码都是属于前端代码。 之前用过qt框架&#xff0c;也是用来写界面的&#xff0c;但是那是用来写客户端的&#xff0c;而html是用来写web浏览器的&#xff0c;相较之下htmlcssJavaScript写出来的界面是更加漂亮的。这里就记录我自个学习后的一些笔…

【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法

工作经验一年以上程序员必问问题 面试题概述 问题为在负责项目时遇到的棘手问题及解决方法&#xff0c;主要考察开发经验与技术水平&#xff0c;回答不佳会影响面试印象。提供四个回答方向&#xff0c;准备其中一个方向即可。 1、设计模式应用方向 以登录为例&#xff0c;未…

2025华数杯国际赛A题完整论文讲解(含每一问python代码+数据+可视化图)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2025“华数杯”国际大学生数学建模竞赛A题Can He Swim Faster的完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文…

关闭window10或11自动更新和自带杀毒

关闭window10或11自动更新和自带杀毒 1.关闭系统更新**修改组策略关闭自动更新****修改服务管理器关闭自动更新** 2.关闭系统杀毒 为什么需要关闭更新和杀毒 案例&#xff1a; #装完驱动隔一段时间就掉 #一些设置隔一段时间就重置了 #防止更新系统后有时卡 1.关闭系统更新 我…

解析OVN架构及其在OpenStack中的集成

引言 随着云计算技术的发展&#xff0c;虚拟化网络成为云平台不可或缺的一部分。为了更好地管理和控制虚拟网络&#xff0c;Open Virtual Network (OVN) 应运而生。作为Open vSwitch (OVS) 的扩展&#xff0c;OVN 提供了对虚拟网络抽象的支持&#xff0c;使得大规模部署和管理…

【ArcGIS技巧】如何给CAD里的面注记导入GIS属性表中

前面分享了GIS怎么给田块加密高程点&#xff0c;但是没有分享每块田的高程对应的是哪块田&#xff0c;今天结合土地整理软件GLAND做一期田块的属性怎么放入GIS属性表当中。 1、GLAND数据 杭州阵列软件&#xff08;GLand&#xff09;是比较专业的土地整理软件&#xff0c;下载之…

Excel中SUM求和为0?难道是Excel有Bug!

大家好&#xff0c;我是小鱼。 在日常工作中有时会遇到这样的情况&#xff0c;对Excel表格数据进行求和时&#xff0c;结果竟然是0&#xff0c;很多小伙伴甚至都怀疑是不是Excel有Bug&#xff01;其实&#xff0c;在WPS的Excel表格中数据求和&#xff0c;结果为0无法正确求和的…