English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

معالجة الاستثناءات JSP

عند كتابة برمجة JSP، قد ينسى المبرمج بعض الأخطاء، وقد تظهر هذه الأخطاء في أي مكان في البرنامج. عادةً تحتوي كود JSP على أنواع معينة من الاستثناءات:

  • استثناءات التحقق: هي استثناءات نموذجية للأخطاء المستخدمة أو الأخطاء التي لا يمكن للمبرمج التنبؤ بها. على سبيل المثال، إذا كان يتم فتح ملف ولكن لا يمكن العثور على هذا الملف، يتم رمي استثناء. لا يمكن تجاهل هذه الاستثناءات بسهولة في وقت التجميع.
  • استثناءات الوقت الفعلي: قد يتفادى البرمجية استثناءً في الوقت الفعلي، وستُغض الطرف عن هذه الاستثناءات في وقت التجميع.
  • خطأ: الخطأ ليس استثناءً لكن المشكلة هي أنه يتعدي نطاق التحكم للمستخدم أو المبرمج. يُغض الطرف عن الأخطاء عادةً في الكود، ولا يمكنك القيام بكثير بهذه الأخطاء. على سبيل المثال، خطأ انهيار السلسلة. هذه الأخطاء تُغض الطرف عنها في وقت التجميع.

سيقدم هذا الفصل بعض الطرق البسيطة والجميلة لمعالجة الاستثناءات وال أخطاء في الوقت الفعلي.

استخدام Object Exception

Object exception هو مثال على فرع Throwable، وهو متاح فقط في صفحات الأخطاء. يوضح الجدول أدناه بعض الطرق المهمة في فئة Throwable:

رقم طريقة&وصف
1

يعيد معلومات الاستثناء. هذه المعلومات تُتميز في بناء Function Throwable
2 public Throwable getCause()

يعيد سبب الاستثناء، وهو Object Throwable
3 public String toString()

يعيد اسم الكائن
4 public void printStackTrace()

يخرج مسار استثناء الدعوة إلى System.err
5 public StackTraceElement [] getStackTrace()

يعيد استرجاع مسار الاستثناء كعدد من عناصر مسار الدعوة
6 public Throwable fillInStackTrace()

استخدام مسار الدعوة الحالي لتعبئة Object Throwable

يقدم JSP خيارًا لتحديد صفحة الخطأ لكل صفحة JSP. في أي وقت يُلقي الصفحة استثناءً، يتم تنفيذ صفحة الخطأ تلقائيًا من قبل وحدة المعالجة.

يحدد هذا المثال صفحة الخطأ المحددة لـ main.jsp. يمكنك تحديد صفحة الخطأ باستخدام تعليمات <%@page errorPage="XXXXX"%>.

<%@ page errorPage="ShowError.jsp" %>
<html>
<head>
   <title>مثال على معالجة الأخطاء</title>
</head>
<body>
<%
   // ألقي استثناءً لاستدعاء صفحة الخطأ
   int x = 1;
   إذا (x == 1)
   }
      throw new RuntimeException("Error condition!!!");
   }
%>
</body>
</html>

الآن، اكتب ملف ShowError.jsp كما يلي:

<%@ page isErrorPage="true" %>
<html>
<head>
<title>عرض صفحة الخطأ</title>
</head>
<body>
<h1>هاي...</h1>
<p>آسف، حدث خطأ.</p>
<p>هذا هو سجل استدعاء الاستثناء:</p>
<pre>
<% exception.printStackTrace(response.getWriter()); %>

لاحظ أن ملف ShowError.jsp يستخدم التعليمات البرمجية <%@page isErrorPage="true"%>، التي تخبر معدير JSP عن الحاجة إلى توليد متغير مثال استثناء.

الآن، حاول زيارة صفحة main.jsp، وسينتج عن ذلك ما يلي:

java.lang.RuntimeException: Error condition!!!
......
هاي...
آسف، حدث خطأ.
هذا هو سجل استدعاء الاستثناء:

استخدام علامات JSTL في صفحة الخطأ

يمكن استخدام علامات JSTL لإنشاء صفحة الأخطاء ShowError.jsp. بلغة الكود في هذا المثال مشابهة للكود في المثال السابق، ولكن الكود في هذا المثال له بنية أفضل، ويمكنه تقديم معلومات إضافية:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page isErrorPage="true" %>
<html>
<head>
<title>عرض صفحة الخطأ</title>
</head>
<body>
<h1>هاي...</h1>
<table width="100%" border="1">
<tr valign="top">
<td width="40%"><b>خطأ:</b></td>
<td>${pageContext.exception}</td>
</tr>
<tr valign="top">
<td><b>المسار:</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="trace" 
         items="${pageContext.exception.stackTrace}">
<p>${trace}</p>
</c:forEach>
</td>
</tr>
</table>
</body>
</html>

النتيجة بعد التنفيذ كالتالي:

استخدام مكتبة try…catch

إذا كنت ترغب في وضع معالجة الاستثناءات في صفحة واحدة وتعامل مختلف الاستثناءات بشكل مختلف، فإنك بحاجة إلى استخدام مكتبة try…catch.

في هذا المثال التالي يظهر كيفية استخدام مكتبة try…catch، ضع هذه الأكواد في ملف main.jsp:

<html>
<head>
   <title>مثال على Try...Catch</title>
</head>
<body>
<%
   try{
      int i = 1;
      i = i / 0;
      out.println("الإجابة هي " + i);
   }
   catch (Exception e){
      out.println("An exception occurred: " + e.getMessage());
   }
%>
</body>
</html>

حاول زيارة main.jsp، سيكون لديك النتيجة التالية:

حدث استثناء: / by zero