เมื่อเขียนโปรแกรม JSP โปรแกรมเมอร์อาจพลาดข้อบกพร่องบางอย่าง และข้อบกพร่องเหล่านี้อาจปรากฏขึ้นที่ใดก็ได้ในโปรแกรม โดยปกติจะมีข้อยกเว้นประเภทต่อไปนี้ในโค้ด JSP:
ข้อยกเว้นที่ตรวจสอบ: ข้อยกเว้นที่ตรวจสอบแล้วเป็นข้อผิดพลาดทั่วไปของผู้ใช้หรือข้อผิดพลาดที่โปรแกรมเมอร์ไม่สามารถคาดการณ์ได้ ตัวอย่างเช่น หากไฟล์กำลังจะถูกเปิด แต่ไม่พบไฟล์นั้น ข้อยกเว้นจะถูกส่งออกไป ข้อยกเว้นเหล่านี้ไม่สามารถละเลยได้ในขณะคอมไพล์
ข้อยกเว้นรันไทม์: โปรแกรมเมอร์อาจหลีกเลี่ยงข้อยกเว้นรันไทม์ได้
ข้อผิดพลาด: ไม่มีข้อยกเว้นในที่นี้ แต่ปัญหาคืออยู่นอกเหนือการควบคุมของผู้ใช้หรือโปรแกรมเมอร์ ข้อผิดพลาดมักถูกละเลยในโค้ด และคุณทำอะไรไม่ได้เลย ตัวอย่างเช่น ข้อผิดพลาดสแต็กโอเวอร์โฟลว์ ข้อผิดพลาดเหล่านี้จะถูกละเว้นในขณะรวบรวม
ส่วนนี้จะให้วิธีที่ง่ายและสวยงามหลายวิธีในการจัดการกับข้อยกเว้นและข้อผิดพลาดรันไทม์
อ็อบเจ็กต์ข้อยกเว้นเป็นอินสแตนซ์ของคลาสย่อย Throwable และใช้ได้เฉพาะในหน้าข้อผิดพลาดเท่านั้น ตารางต่อไปนี้แสดงวิธีการที่สำคัญบางอย่างในคลาส Throwable:
หมายเลขซีเรียล | วิธีการ และ คำอธิบาย |
---|---|
1 | public String getMessage() ส่งคืนข้อมูลข้อยกเว้น ข้อมูลนี้เริ่มต้นได้ใน Throwable Constructor |
2 | ThrowablegetCause() สาธารณะ ส่งคืนสาเหตุของข้อยกเว้น ประเภทคือ Throwable object |
3 | public String toString() ส่งคืนชื่อคลาส |
4 | โมฆะสาธารณะ printStackTrace() ส่งออกการติดตามสแต็กข้อยกเว้นไปยัง System.err |
5 | StackTraceElement สาธารณะ [] getStackTrace() ส่งคืนการติดตามสแต็กข้อยกเว้นในรูปแบบของอาร์เรย์ขององค์ประกอบการติดตามสแต็ก |
6 | ThrowablefillInStackTrace() สาธารณะ ใช้การติดตามสแต็กปัจจุบันเพื่อเติมวัตถุ Throwable |
JSP จัดเตรียมตัวเลือกเพื่อระบุเพจข้อผิดพลาดสำหรับเพจ JSP แต่ละเพจ เมื่อใดก็ตามที่เพจส่งข้อยกเว้น คอนเทนเนอร์ JSP จะเรียกเพจข้อผิดพลาดโดยอัตโนมัติ
ตัวอย่างต่อไปนี้ระบุหน้าข้อผิดพลาดสำหรับ main.jsp ใช้คำสั่ง <%@page errorPage="XXXXX"%> เพื่อระบุหน้าข้อผิดพลาด
<%@ page errorPage="ShowError.jsp" %><html><head> <title>ตัวอย่างการจัดการข้อผิดพลาด</title></head><body><% // ส่งข้อยกเว้นเพื่อเรียกใช้หน้าข้อผิดพลาด int x = 1; if (x == 1) { โยน RuntimeException ใหม่ ("เงื่อนไขข้อผิดพลาด!!!"); } %></body></html>
ตอนนี้ให้เขียนไฟล์ ShowError.jsp ดังนี้:
<%@ หน้า isErrorPage="true" %><html><head><title>แสดงหน้าข้อผิดพลาด</title></head><body><h1>ขออภัย...</h1><p>ขออภัย เกิดข้อผิดพลาด</p><p>นี่คือการติดตามสแต็กข้อยกเว้น: </p><pre><% ข้อยกเว้น.printStackTrace(response.getWriter()); %>
โปรดสังเกตว่าไฟล์ ShowError.jsp ใช้คำสั่ง <%@page isErrorPage="true"%> ซึ่งบอกคอมไพลเลอร์ JSP ว่าจำเป็นต้องสร้างตัวแปรอินสแตนซ์ข้อยกเว้น
ตอนนี้ให้ลองเข้าถึงหน้า main.jsp มันจะให้ผลลัพธ์ดังต่อไปนี้:
java.lang.RuntimeException: เงื่อนไขข้อผิดพลาด!!!......ขออภัย...ขออภัย เกิดข้อผิดพลาด นี่คือการติดตามสแต็กข้อยกเว้น:
คุณสามารถใช้แท็ก JSTL เพื่อเขียนหน้าแสดงข้อผิดพลาด ShowError.jsp โค้ดในตัวอย่างนี้เกือบจะเหมือนกับโค้ดในตัวอย่างก่อนหน้านี้ แต่โค้ดในตัวอย่างนี้มีโครงสร้างที่ดีกว่าและให้ข้อมูลเพิ่มเติม:
<%@ คำนำหน้า taglib = "c" uri = "http://java.sun.com/jsp/jstl/core" %><%@page isErrorPage = "true" %><html><head><title> แสดงหน้าข้อผิดพลาด</title></head><body><h1>ขออภัย...</h1><table><tr valign="top"><td><b>ข้อผิดพลาด:</b></td><td>${pageContext.ข้อยกเว้น</td></tr><tr valign="top"><td> <b>URI:</b></td><td>${pageContext.errorData.requestURI}</td></tr><tr valign="top"><td><b>สถานะ รหัส:</b></td><td>${pageContext.errorData.statusCode}</td></tr><tr valign="top"><td><b>การติดตามสแต็ก:</b> </td><td><c:forEach var="ติดตาม" รายการ="${pageContext.Exception.stackTrace}"><p>${trace}</p></c:forEach></td></tr></table></body></html>
ผลการวิ่งมีดังนี้:
หากคุณต้องการใส่การจัดการข้อยกเว้นในเพจและจัดการข้อยกเว้นที่แตกต่างกันแตกต่างกัน คุณจะต้องใช้ try...catch block
ตัวอย่างต่อไปนี้แสดงวิธีใช้ try...catch block โดยการวางโค้ดนี้ใน main.jsp:
<html><head> <title>ลอง...จับตัวอย่าง</title></head><body><% try{ int i = 1; i = i / 0; out.println("คำตอบคือ " + i); } catch (ข้อยกเว้น e){ out.println("มีข้อยกเว้นเกิดขึ้น: " + e.getMessage()); } %></body></html>
ลองเข้าไปที่ main.jsp มันจะให้ผลลัพธ์ดังต่อไปนี้:
มีข้อยกเว้นเกิดขึ้น: / โดยศูนย์