JSP - Xử lý ngoại lệ
Trong chương này. chúng ta sẽ thảo luận về cách xử lý các ngoại lệ trong JSP. Khi bạn đang viết mã JSP, bạn có thể mắc lỗi mã hóa có thể xảy ra ở bất kỳ phần nào của mã. Có thể xảy ra các loại lỗi sau trong mã JSP của bạn:
Đã kiểm tra ngoại lệ
Một ngoại lệ đã kiểm tra là một ngoại lệ thường là lỗi của người dùng hoặc một vấn đề mà người lập trình không thể lường trước được. Ví dụ, nếu một tệp được mở, nhưng không thể tìm thấy tệp, thì một ngoại lệ sẽ xảy ra. Những ngoại lệ này không thể đơn giản bị bỏ qua tại thời điểm biên dịch.
Ngoại lệ thời gian chạy
Ngoại lệ thời gian chạy là một ngoại lệ mà lập trình viên có thể tránh được. Trái ngược với các ngoại lệ đã kiểm tra, các ngoại lệ thời gian chạy bị bỏ qua tại thời điểm khen ngợi.
Lỗi
Đây không phải là ngoại lệ, mà là những vấn đề phát sinh ngoài tầm kiểm soát của người dùng hoặc người lập trình. Các lỗi thường bị bỏ qua trong mã của bạn vì bạn hiếm khi có thể làm gì với lỗi. Ví dụ, nếu xảy ra tràn ngăn xếp, lỗi sẽ phát sinh. Chúng cũng được bỏ qua tại thời điểm biên dịch.
Chúng tôi sẽ thảo luận thêm về các cách để xử lý lỗi / ngoại lệ thời gian chạy xảy ra trong mã JSP của bạn.
Sử dụng Đối tượng Ngoại lệ
Đối tượng ngoại lệ là một thể hiện của một lớp con của Throwable (ví dụ: java.lang. NullPointerException) và chỉ có sẵn trong các trang lỗi. Bảng sau liệt kê các phương thức quan trọng có sẵn trong lớp Throwable.
Không. | Phương pháp & Mô tả |
---|---|
1 | public String getMessage() Trả về một thông báo chi tiết về ngoại lệ đã xảy ra. Thông báo này được khởi tạo trong phương thức khởi tạo Throwable. |
2 | public Throwable getCause() Trả về nguyên nhân của ngoại lệ như được đại diện bởi một đối tượng Có thể ném. |
3 | public String toString() Trả về tên của lớp được nối với kết quả của getMessage(). |
4 | public void printStackTrace() In kết quả của toString() cùng với dấu vết ngăn xếp để System.err, luồng đầu ra lỗi. |
5 | public StackTraceElement [] getStackTrace() Trả về một mảng chứa mỗi phần tử trên dấu vết ngăn xếp. Phần tử ở chỉ số 0 đại diện cho phần trên cùng của ngăn xếp cuộc gọi và phần tử cuối cùng trong mảng đại diện cho phương thức ở cuối ngăn xếp cuộc gọi. |
6 | public Throwable fillInStackTrace() Làm đầy dấu vết ngăn xếp của đối tượng Có thể ném này bằng dấu vết ngăn xếp hiện tại, thêm vào bất kỳ thông tin nào trước đó trong dấu vết ngăn xếp. |
JSP cung cấp cho bạn một tùy chọn để chỉ định Error Pagecho mỗi JSP. Bất cứ khi nào trang ném ra một ngoại lệ, vùng chứa JSP sẽ tự động gọi trang lỗi.
Sau đây là một ví dụ để xác định một trang lỗi cho một main.jsp. Để thiết lập trang lỗi, hãy sử dụng<%@ page errorPage = "xxx" %> chỉ thị.
<%@ 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>
Bây giờ chúng ta sẽ viết một Xử lý lỗi JSP ShowError.jsp, được đưa ra bên dưới. Lưu ý rằng trang xử lý lỗi bao gồm lệnh<%@ page isErrorPage = "true" %>. Chỉ thị này khiến trình biên dịch JSP tạo ra biến cá thể ngoại lệ.
<%@ 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()); %></pre>
</body>
</html>
Truy cập main.jsp, bạn sẽ nhận được một đầu ra giống như sau:
java.lang.RuntimeException: Error condition!!!
......
Opps...
Sorry, an error occurred.
Here is the exception stack trace:
Sử dụng thẻ JSTL cho trang lỗi
Bạn có thể sử dụng các thẻ JSTL để viết một trang lỗi ShowError.jsp. Trang này có logic gần giống như trong ví dụ trên, với cấu trúc tốt hơn và nhiều thông tin hơn -
<%@ 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>
Truy cập main.jsp, phần sau sẽ được tạo:
Opps...
Error:
java.lang.RuntimeException: Error condition!!!
URI:
/main.jsp
Status code:
500
Stack trace:
org.apache.jsp.main_jsp._jspService(main_jsp.java:65)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
Sử dụng Try ... Catch Block
Nếu bạn muốn xử lý các lỗi trong cùng một trang và muốn thực hiện một số hành động thay vì kích hoạt một trang lỗi, bạn có thể sử dụng try....catch khối.
Sau đây là một ví dụ đơn giản cho thấy cách sử dụng khối try ... catch. Hãy để chúng tôi đặt đoạn mã sau vào 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>
Truy cập vào main.jsp, nó sẽ tạo ra một đầu ra giống như sau:
An exception occurred: / by zero