记录5

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

今天是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 {
    @Override
    protected 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>");
    }

    @Override
    protected 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 {
    @Override
    protected 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);

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

posted @ 2025-02-19 22:38  马瑞鑫03  阅读(16)  评论(0)    收藏  举报