记录7

news/2025/2/21 8:53:57/文章来源:https://www.cnblogs.com/mlo9i/p/18725492

JavaWeb每日学习记录(第7天):异常处理与日志记录

2024年X月X日 星期X 晴

今天是JavaWeb学习的第七天,我主要学习了异常处理机制和日志记录技术。在Web开发中,异常处理是确保应用稳定运行的关键环节,而日志记录则是排查问题和监控应用运行状态的重要手段。通过今天的实践,我对如何在JavaWeb中优雅地处理异常和记录日志有了更深入的理解。


一、异常处理机制

在JavaWeb应用中,异常处理是不可避免的。无论是用户输入错误、数据库问题,还是其他运行时错误,都需要合理地捕获和处理异常,以避免应用崩溃或返回不友好的错误页面。

示例1:全局异常处理Servlet

我编写了一个全局异常处理Servlet,用于捕获所有未处理的异常,并返回友好的错误页面。

全局异常处理Servlet(ErrorServlet.java)

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/error")
public class ErrorServlet extends javax.servlet.http.HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取异常信息Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");String uri = (String) request.getAttribute("javax.servlet.error.request_uri");// 设置响应内容response.setContentType("text/html;charset=UTF-8");response.setStatus(statusCode != null ? statusCode : 500);// 返回友好的错误页面response.getWriter().println("<!DOCTYPE html>");response.getWriter().println("<html><head><title>错误页面</title></head><body>");response.getWriter().println("<h1>发生错误</h1>");response.getWriter().println("<p>错误状态码:" + (statusCode != null ? statusCode : "未知") + "</p>");response.getWriter().println("<p>请求URI:" + (uri != null ? uri : "未知") + "</p>");response.getWriter().println("<p>异常信息:" + (throwable != null ? throwable.getMessage() : "无") + "</p>");response.getWriter().println("</body></html>");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

web.xml中配置错误页面:

<error-page><exception-type>java.lang.Exception</exception-type><location>/error</location>
</error-page>
<error-page><error-code>404</error-code><location>/error</location>
</error-page>

通过这种方式,我可以捕获所有未处理的异常,并将用户重定向到一个友好的错误页面,而不是显示默认的Tomcat错误页面。

示例2:局部异常处理

除了全局异常处理,我还在具体的Servlet中添加了局部异常处理逻辑,用于处理特定的业务异常。

示例Servlet(TestServlet.java)

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/test")
public class TestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try {int num = Integer.parseInt(request.getParameter("num"));int result = 10 / num;response.getWriter().println("结果:" + result);} catch (NumberFormatException e) {response.getWriter().println("请输入有效的数字!");} catch (ArithmeticException e) {response.getWriter().println("除数不能为0!");} catch (Exception e) {response.getWriter().println("发生未知错误:" + e.getMessage());}}
}

通过局部异常处理,我可以针对不同的异常类型返回不同的提示信息,从而提升用户体验。


二、日志记录

在Web开发中,日志记录是排查问题和监控应用运行状态的重要手段。我学习了如何使用Log4j2框架来记录日志。

示例3:使用Log4j2记录日志

我引入了Log4j2依赖,并配置了日志记录器,用于记录应用的运行日志。

引入Log4j2依赖(Maven配置)

<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.17.1</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.17.1</version>
</dependency>

Log4j2配置文件(log4j2.xml)

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/></Console><File name="File" fileName="logs/app.log"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/></File></Appenders><Loggers><Root level="debug"><AppenderRef ref="Console"/><AppenderRef ref="File"/></Root></Loggers>
</Configuration>

使用Log4j2记录日志(TestServlet.java)

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/test")
public class TestServlet extends HttpServlet {private static final Logger logger = LogManager.getLogger(TestServlet.class);@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try {int num = Integer.parseInt(request.getParameter("num"));int result = 10 / num;response.getWriter().println("结果:" + result);} catch (NumberFormatException e) {logger.error("输入的数字无效!", e);response.getWriter().println("请输入有效的数字!");} catch (ArithmeticException e) {logger.error("除数不能为0!", e);response.getWriter().println("除数不能为0!");} catch (Exception e) {logger.error("发生未知错误!", e);response.getWriter().println("发生未知错误:" + e.getMessage());}}
}

通过Log4j2,我可以将日志记录到控制台和文件中,方便后续排查问题和监控应用运行状态。


三、总结

今天我学习了JavaWeb中的异常处理机制和日志记录技术。通过全局异常处理Servlet和局部异常处理,我能够优雅地处理各种异常,并返回友好的错误提示。同时,通过引入Log4j2框架,我实现了日志记录功能,方便监控应用运行状态和排查问题。

这些内容让我对JavaWeb应用的健壮性和可维护性有了更深刻的理解。明天,我计划学习JavaWeb中的文件上传与下载功能,进一步完善Web应用的交互能力。

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

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

相关文章

史上最全桌面级CPU天梯图-2024年10月更新(包含13/14代Intel/7000系列锐龙)

史上最全桌面级CPU天梯图-2024年10月更新(包含13/14代Intel/7000系列锐龙) 原文:https://www.zhihu.com/tardis/bd/art/499783467?source_id=1001

large_bin_attack

large_bin的结构如下 /*This struct declaration is misleading (but accurate and necessary).It declares a "view" into memory allowing access to necessaryfields at known offsets from a given base. See explanation below. */ struct malloc_chunk {INTERN…

体验用ai做了个python小游戏

写在前面:最近ai确实比较火。各种生成式AI,包括文字、图片、视频。之前听说ai生产代码能力比较强,一直想试试。所以及就有了本问。使用的工具deepinseek :用来生成python代码即梦:用来生成图片素材Remove.bg:用来对生成的图片素材去除背景pixabay.com:用来下载音乐素材游…

2.1.5 节省内存

首先来介绍一下可变对象和不可变对象可变对象:整数,浮点数,字符串,元组等 不可变对象:列表,字典,集合等然后看一下Python中内存分配的方式 执行x=1会发生什么?此时,内存会分配一个地址给1,1是一个整型对象,而x是一个引用(不是对象!),指向1所在的位置,并不占用实…

ABC392E翻译

AT_abc392_e [ABC392E] Cables and Servers 题目描述 有编号从 \(1\) 到 \(N\) 的 \(N\) 台服务器和编号从 \(1\) 到 \(M\) 的 \(M\) 根电缆。 电缆 \(i\) 双向连接服务器 \(A_i\) 和服务器 \(B_i\)。 通过进行以下操作(可以是 \(0\) 次),使得所有服务器之间都能通过电缆相互…

【外贸】集装箱的规格

集装箱类型(以米为单位)集装箱类型 外部尺寸(长宽高) 内部尺寸(长宽高) 容积(立方米) 载重(公斤)20英尺标准集装箱 6.1m 2.44m 2.59m 5.9m 2.35m 2.39m 33 28,00040英尺标准集装箱 12.2m 2.44m 2.59m 12m 2.35m 2.39m 67 26,50040英尺高柜集装箱 12.2m 2.44…

PriorityBlockingQueue 的put方法底层源码

一、PriorityBlockingQueue 的put方法底层源码 PriorityBlockingQueue 的 put 方法用于将元素插入队列。由于 PriorityBlockingQueue 是一个无界队列,put 方法不会阻塞,总是会成功插入元素 1、put 方法的作用将元素插入队列。由于队列无界,put 方法不会阻塞,总是会成功插入…

深度剖析多任务模型 QAT 策略

本文为笔者个人见解,如有不同意见欢迎评论1.引言 为了节省端侧计算资源以及简化部署工作,目前智驾方案中多采用动静态任务融合网络,地平线也释放了 Lidar-Camera 融合多任务 BEVFusion 参考算法。这种多任务融合网络的浮点训练策略可以简述为: 首先在大量数据的条件下完成多…

猫步简历 - 开源免费AI简历生成器 | 一键导出PDF/JSON

猫步简历是一款免费开源的AI简历生成与制作神器,旨在帮助求职者轻松创建独特、优美且专业的简历。无论是应届毕业生、职场新人,还是资深专业人士,猫步简历都能满足您的需求。它支持导出超高清PDF、图片、源码级JSON数据等多种格式,并提供AI智能创作、AI语种切换、AI润色等强…

老年人能力评估uni-app

登录界面 (https://img2024.cnblogs.com/blog/3474174/202502/3474174-20250219211712486-62129844.png) 老年人信息界面添加老年人信息界面这个不知道哪里写错了,选择器的选项看不到。我本来想和web端一样,用弹出对话框来添加老年人信息的,结果整了半天,对话框弹不出来,然…

ICLR 2025 时间序列

1. TimeMixer++: A General Time Series Pattern Machine for Universal Predictive Analysis 链接:https://openreview.net/forum?id=1CLzLXSFNn 关键词:多任务(预测,分类,插补,异常检测)、基础模型 TL;DR:TimeMixer++ 是一种时间序列模式机器,它采用多尺度和多分辨…

用于 Qt 的 OpenCV 编译 (CMake 方式) 问题解决

本文主要参考 《QT+opencv源码编译》:https://blog.csdn.net/m0_49156395/article/details/135721596 详细步骤请阅读上面文章,本文主要着重强调其中的关键步骤。 一、Configure(CMakeList.txt)和 generate(Makefile) 过程(11)先进行初次Configure "Where to build th…