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应用的交互能力。