Xử lý ngoại lệ (Exception) trong JSP

Khi viết JSP code, lập trình viên có thể tạo lỗi ở bất cứ phần nào của code. Bạn có thể có các loại Error sau trong JSP code.

  • Checked exceptions: Một Checked exception là một lỗi người sử dụng đặc trưng hoặc một vấn đề mà không thể dự báo trước bởi lập trình viên. Ví dụ, nếu một file cần được mở, nhưng nó file đó là không thể tìm thấy, thì một exception xuất hiện. Những exception này không thể bị bỏ qua một cách đơn giản tại thời điểm biên dịch.
  • Runtime exceptions: Một Runtime exception là một ngoại lệ mà xảy ra có thể được tránh bởi lập trình viên. Trái ngược với Checked Exception, runtime exception được bỏ qua tại thời điểm biên dịch.
  • Errors: Chúng không hoàn toàn là exception, nhưng là các vấn đề mà xuất hiện vượt quá sự điều khiển của người dùng hoặc lập trình viên. Nét đặc trưng là, các Error được bỏ qua trong code bởi vì bạn có thể hiếm khi thực hiện điều gì đó về một Error này. Ví dụ, một sự tràn stack (stack overflow) xuất hiện, một error sẽ xuất hiện Chúng cũng được bỏ qua tại thời điểm biên dịch.

Chương này cung cấp cho bạn các cách đơn giản và hiệu quả để để xử lý runtime exception/error xảy ra trong JSP code.

Sử dụng đối tượng Exception trong JSP

Đối tượng exception là một trường hợp của lớp phụ của Throwable (ví dụ: java.lang. NullPointerException) và chỉ có sẵn trong các error page. Sau đây là danh sách các phương thức quan trọng trong lớp Throwable.

STTPhương thức và Miêu tả
1public String getMessage()


Trả về một thông báo chi tiết về Exception đã xuất hiện đó. Thông báo này được khởi tạo trong Throwable constructor

2public Throwable getCause()


Trả về nguyên nhân của Exception khi được biểu diễn bởi một đối tượng Throwable

3public String toString()


Trả về tên của lớp được nối chuỗi với kết quả của getMessage()

4public void printStackTrace()


In kết quả của toString() cùng với stack trace tới System.err (Error Output Stream)

5public StackTraceElement [] getStackTrace()


Trả về một mảng chứa mỗi phần tử trên Stack trace. Phần tử tại chỉ mục 0 biểu diễn phần trên cùng của stack đang gọi, và phần tử cuối cùng trong mảng biểu diễn phương thức đó tại cuối của stack đang gọi

6public Throwable fillInStackTrace()


Điền vào stack trace của đối tượng Throwable này với stack trace hiện tại, thêm tới bất kỳ phần thông tin trước đó trong stack trace

JSP cung cấp cho bạn một tùy chọn để xác định Error Page cho mỗi JSP. Bất cứ khi nào page ném một exception, JSP container tự động gọi error page.

Sau đây là một ví dụ đơn giản để xác định một error page cho một main.jsp. Để thiết lập một error page, sử dụng <%@ page errorPage="xxx" %> directive.

<%@ 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ờ bạn sẽ phải viết một chương trình Xử lý lỗi trong JSP là ShowError.jsp, được cung cấp dưới đây. Chú ý rằng, trang xử lý lỗi bao gồm directive là <%@ page isErrorPage="true" %>.

Directive này làm JSP compiler để tạo biến exception instance.

<%@ 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>


<% exception.printStackTrace(response.getWriter()); %>


</body>
</html>

Thử truy cập main.jsp trên, nó sẽ tạo ra:

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


Opps...
Sorry, an error occurred.


Here is the exception stack trace:

Sử dụng JSTL tags cho Error Page trong JSP

Bạn có thể sử dụng JSTL tags để viết một error page là ShowError.jsp. Trang này có logic giống như những gì chúng ta đã sử dụng trong ví dụ trên, nhưng có cấu trúc tốt hơn và nó cung cấp 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></td>
</tr>
<tr valign="top">
<td><b>URI:</b></td>
<td></td>
</tr>
<tr valign="top">
<td><b>Status code:</b></td>
<td>0</td>
</tr>
<tr valign="top">
<td><b>Stack trace:</b></td>
<td>
<c:forEach var="trace" 
         items="">
<p></p>
</c:forEach>
</td>
</tr>
</table>
</body>
</html>

Thử truy cập main.jsp, nó sẽ cho kết quả:

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 khối Try…Catch trong JSP

Nếu bạn muốn xử lý các Error bên 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 error page, bạn có thể sử dụng khối try…catch trong JSP.

Sau đây là ví dụ đơn giản minh họa cách sử dụng khối try…catch trong JSP. Đặt code trên trong 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>

Thử truy cập main.jsp, nó sẽ cho kết quả sau:

An exception occurred: / by zero 

Bình luận