首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

JSP errorPage 錯誤頁面配置與異常處理實戰

     編輯:關於JSP

兩種配置方式

1. 頁面級指定 (單一 JSP)

錯誤頁面 `errorPage.jsp`:

<%@ page isErrorPage="true" contentType="text/html;charset=UTF-8" %>
<html><head><title>系統錯誤</title></head><body>
    <h1>發生錯誤!</h1>
    <p><strong>訊息:</strong> ${pageContext.exception.message} </p>
    <p><strong>堆疊追蹤:</strong></p>
    <pre>${pageContext.exception.stackTrace}</pre>
</body></html>

業務頁面 `business.jsp`:

<%@ page errorPage="errorPage.jsp" contentType="text/html;charset=UTF-8" %>
<html><body>
    <%
        // 模擬異常
        String info = getServletInfo();
        throw new RuntimeException("業務邏輯異常: " + info);
    %>
</body></html>

2. 全域配置 (web.xml) — 推薦生產環境

<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/error/general.jsp</location>
</error-page>
<error-page>
    <error-code>404</error-code>
    <location>/error/404.jsp</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/error/500.jsp</location>
</error-page>

錯誤頁面可用的隱含物件

只有 `isErrorPage="true"` 的頁面才能存取 `exception` 物件 (型別 `java.lang.Throwable`)。

錯誤頁面最佳實踐

  1. 不暴露堆疊追蹤給使用者: 生產環境僅顯示友善訊息,詳細日誌寫入伺服器日誌 (Log4j/SLF4J)。
  2. 記錄完整上下文: 在錯誤頁面或 Filter 中記錄:請求 URL、參數、使用者 IP、Session ID、異常堆疊。
  3. 區分異常類型: 業務異常 (如 `InsufficientBalanceException`) 導向提示頁;系統異常導向通用錯誤頁。
  4. 保持風格一致: 錯誤頁面使用網站共同版面 (Header/Footer),避免白頁面突兀。
  5. 避免在錯誤頁面再拋異常: 錯誤頁面本身若出錯,容器會顯示預設醜陋的錯誤頁,陷入循環。
  6. Spring MVC 專案: 使用 `@ControllerAdvice` + `@ExceptionHandler` 統一處理,回傳 JSON 或視圖,不依賴 `web.xml` error-page。

進階:自定義錯誤屬性傳遞

在 `web.xml` error-page 對應的 Servlet/JSP 中,可從 request 取得原始請求資訊:

String requestUri = (String) request.getAttribute("javax.servlet.error.request_uri");
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
String servletName = (String) request.getAttribute("javax.servlet.error.servlet_name");

測試範例

<%@ page errorPage="errorPage.jsp" %>
<html><body>
    <% int a = 1 / 0; %> <!-- 觸發 ArithmeticException -->
</body></html>

瀏覽器將導向 `errorPage.jsp`,顯示 `/ by zero` 訊息。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
物件型別說明
exceptionThrowable拋出的異常實例
pageContextPageContext可取得 request、session、application 等
requestHttpServletRequest原始請求 (含屬性 `javax.servlet.error.exception` 等)
responseHttpServletResponse回應物件,狀態碼已設為 500