Latest web development tutorials

การจัดการข้อยกเว้น JSP

เมื่อเขียนใช้ JSP โปรแกรมเมอร์อาจพลาด BUG บางข้อผิดพลาดอาจปรากฏที่ใดก็ได้ในโปรแกรม รหัส JSP โดยทั่วไปยกเว้นประเภทต่อไปนี้:

  • ข้อยกเว้นการตรวจสอบ: การตรวจสอบข้อยกเว้นเป็นข้อผิดพลาดหรือผู้ใช้ทั่วไปโปรแกรมเมอร์ข้อผิดพลาดที่ไม่คาดฝัน ตัวอย่างเช่นถ้าแฟ้มถูกจะเปิด แต่ไม่สามารถหาไฟล์แล้วยกเว้นจะโยน ความผิดปกติเหล่านี้ไม่สามารถรวบรวมจะถูกละเว้นเพียง
  • Runtime ข้อยกเว้น: โปรแกรมเมอร์ยกเว้น Runtime อาจมีการหลีกเลี่ยงความผิดปกตินี้จะถูกละเว้นที่รวบรวมเวลา
  • ข้อผิดพลาด: ไม่มีข้อยกเว้น แต่ปัญหาก็คือว่ามันอยู่นอกเหนือการควบคุมของผู้ใช้หรือโปรแกรมเมอร์ ข้อผิดพลาดที่มักจะถูกมองข้ามในรหัสที่คุณแทบจะไม่สามารถใช้มันอย่างไร โดยวิธีการเช่นหรือข้อผิดพลาดกองล้น ข้อผิดพลาดเหล่านี้จะถูกละเว้นที่รวบรวมเวลา

ในส่วนนี้จะให้เป็นวิธีที่ง่ายและสง่างามไม่กี่ที่จะจัดการกับข้อยกเว้น Runtime และข้อผิดพลาด


ใช้ข้อยกเว้นวัตถุ

ยกเว้นวัตถุเป็นตัวอย่างของประเภทรอง Throwable มีจำหน่ายเฉพาะในหน้าข้อผิดพลาด ตารางต่อไปนี้แสดงบางส่วนของชั้น Throwable ในวิธีที่สำคัญ:

เลขที่ วิธีการและคำอธิบาย
1 String สาธารณะ getMessage ()

ส่งกลับข้อยกเว้น ข้อมูลนี้จะเริ่มต้นได้ใน Throwable สร้าง
2 ThrowablegetCause สาธารณะ ()

ผลตอบแทนที่สาเหตุของข้อยกเว้นวัตถุประเภท Throwable
3 สาธารณะ String toString ()

ส่งกลับชื่อของชั้น
4 โมฆะสาธารณะ printStackTrace ()

ยกเว้นในกรณีที่สแต็คร่องรอยส่งออกไปยัง System.err
5 ประชาชน StackTraceElement [] getStackTrace ()

ในรูปแบบขององค์ประกอบสแต็คร่องรอยของอาร์เรย์กลับร่องรอยยกเว้นสแต็ค
6 ThrowablefillInStackTrace สาธารณะ ()

ร่องรอยสแต็คในปัจจุบันเติมวัตถุ Throwable

JSP มีตัวเลือกให้ระบุหน้าข้อผิดพลาดสำหรับแต่ละหน้า JSP เมื่อใดก็ตามที่หน้าพ่นยกเว้น JSP ภาชนะโดยอัตโนมัติจะเรียกหน้าข้อผิดพลาด

ตัวอย่างต่อไปนี้ main.jsp ระบุหน้าข้อผิดพลาด ใช้ <% @ หน้า errorPage = "XXXXX"%> สั่งระบุหน้าข้อผิดพลาด

<%@ page errorPage="ShowError.jsp" %>

<html>
<head>
   <title>Error Handling Example</title>
</head>
<body>
<%
   // Throw an exception to invoke the error page
   int x = 1;
   if (x == 1)
   {
      throw new RuntimeException("Error condition!!!");
   }
%>
</body>
</html>

ตอนนี้เขียนเอกสารดังต่อไปนี้ ShowError.jsp:

<%@ page isErrorPage="true" %>
<html>
<head>
<title>Show Error Page</title>
</head>
<body>
<h1>Opps...</h1>
<p>Sorry, an error occurred.</p>
<p>Here is the exception stack trace: </p>
<pre>
<% exception.printStackTrace(response.getWriter()); %>

สังเกต ShowError.jsp ใช้แฟ้ม <% @ หน้า isErrorPage = "true"%> คำสั่งที่บอกคอมไพเลอร์ JSP ต้องการที่จะสร้างตัวแปรเช่นข้อยกเว้น

ตอนนี้พยายามที่จะเข้าถึงหน้า main.jsp ก็จะก่อให้เกิดผลต่อไปนี้:

java.lang.RuntimeException: Error condition!!!
......

Opps...
Sorry, an error occurred.

Here is the exception stack trace:

ใช้แท็ก JSTL ในหน้าข้อผิดพลาด

แท็ก JSTL สามารถนำมาใช้ในการเขียน ShowError.jsp หน้าข้อผิดพลาด รหัสตัวอย่างนี้และตรรกะในรหัสตัวอย่างที่เกือบจะเหมือนกัน แต่ในกรณีนี้รหัสมีโครงสร้างที่ดีขึ้นและสามารถให้ข้อมูลเพิ่มเติมได้ที่:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page isErrorPage="true" %>
<html>
<head>
<title>Show Error Page</title>
</head>
<body>
<h1>Opps...</h1>
<table width="100%" border="1">
<tr valign="top">
<td width="40%"><b>Error:</b></td>
<td>${pageContext.exception}</td>
</tr>
<tr valign="top">
<td><b>URI:</b></td>
<td>${pageContext.errorData.requestURI}</td>
</tr>
<tr valign="top">
<td><b>Status code:</b></td>
<td>${pageContext.errorData.statusCode}</td>
</tr>
<tr valign="top">
<td><b>Stack trace:</b></td>
<td>
<c:forEach var="trace" 
         items="${pageContext.exception.stackTrace}">
<p>${trace}</p>
</c:forEach>
</td>
</tr>
</table>
</body>
</html>

ผลมีดังนี้

JSP-exeception-1


ใช้ลอง ... จับบล็อก

หากคุณต้องการที่จะนำการจัดการข้อยกเว้นหน้าและสำหรับข้อยกเว้นที่แตกต่างกันได้รับการจัดการที่แตกต่างกันแล้วคุณจะต้องใช้ลอง ... จับบล็อก

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีการใช้ ... ลองจับบล็อกรหัสจะถูกวางใน main.jsp:

<html>
<head>
   <title>Try...Catch Example</title>
</head>
<body>
<%
   try{
      int i = 1;
      i = i / 0;
      out.println("The answer is " + i);
   }
   catch (Exception e){
      out.println("An exception occurred: " + e.getMessage());
   }
%>
</body>
</html>

พยายามที่จะเยี่ยมชม main.jsp ก็จะก่อให้เกิดผลต่อไปนี้:

An exception occurred: / by zero