عند كتابة برامج JSP، قد يغفل المبرمجون بعض الأخطاء، وقد تظهر هذه الأخطاء في أي مكان في البرنامج. توجد عادةً أنواع الاستثناءات التالية في كود JSP:
الاستثناء المحدد: الاستثناء المحدد هو خطأ مستخدم نموذجي أو خطأ لا يستطيع المبرمج توقعه. على سبيل المثال، إذا كان الملف على وشك أن يتم فتحه، ولكن لا يمكن العثور على الملف، فسيتم طرح استثناء. لا يمكن ببساطة تجاهل هذه الاستثناءات في وقت الترجمة.
استثناء وقت التشغيل: ربما تم تجنب استثناء وقت التشغيل بواسطة المبرمج. سيتم تجاهل هذا الاستثناء في وقت الترجمة.
خطأ: لا يوجد استثناء هنا، ولكن المشكلة هي أنه خارج عن سيطرة المستخدم أو المبرمج. غالبًا ما يتم تجاهل الأخطاء في التعليمات البرمجية ولا يوجد الكثير مما يمكنك فعله حيال ذلك. على سبيل المثال، خطأ تجاوز سعة المكدس. سيتم تجاهل هذه الأخطاء في وقت الترجمة.
سيعطيك هذا القسم عدة طرق بسيطة وأنيقة للتعامل مع الاستثناءات والأخطاء في وقت التشغيل.
كائن الاستثناء هو مثيل لفئة فرعية Throwable وهو متاح فقط في صفحات الخطأ. يسرد الجدول التالي بعض الأساليب الهامة في فئة Throwable:
رقم سري | الطريقة والوصف |
---|---|
1 | تقوم السلسلة العامة getMessage() بإرجاع معلومات الاستثناء. تتم تهيئة هذه المعلومات في مُنشئ Throwable |
2 | يُرجع ThrowablegetCause() العام سبب الاستثناء، والنوع هو كائن Throwable |
3 | تقوم السلسلة العامة toString() بإرجاع اسم الفئة |
4 | تقوم printStackTrace() باطلة عامة بإخراج تتبع مكدس الاستثناء إلى System.err |
5 | StackTraceElement العام [] getStackTrace () يُرجع تتبع مكدس الاستثناء في شكل مصفوفة من عناصر تتبع المكدس |
6 | يستخدم ThrowablefillInStackTrace() العام تتبع المكدس الحالي لملء الكائن القابل للرمي |
يوفر JSP خيار تحديد صفحات الخطأ لكل صفحة JSP. عندما تطرح إحدى الصفحات استثناءً، تقوم حاوية JSP تلقائيًا باستدعاء صفحة الخطأ.
يحدد المثال التالي صفحة خطأ لـ main.jsp. استخدم التوجيه <%@page errorPage="XXXX"%> لتحديد صفحة خطأ.
<%@ page errorPage="ShowError.jsp" %><html><head> <title>مثال لمعالجة الأخطاء</title></head><body><% // طرح استثناء لاستدعاء صفحة الخطأ int x = 1; if (x == 1) { throw new RuntimeException("خطأ شرط!!!" } %></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: حالة خطأ!!!...عذرًا...عذرًا، حدث خطأ. إليك تتبع مكدس الاستثناء:
يمكنك استخدام علامات 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><tr valign="top"><td><b>خطأ:</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>الحالة الكود:</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>
نتائج التشغيل هي كما يلي:
إذا كنت تريد وضع معالجة الاستثناءات في صفحة ما والتعامل مع الاستثناءات المختلفة بشكل مختلف، فأنت بحاجة إلى استخدام كتلة المحاولة...catch.
يوضح المثال التالي كيفية استخدام كتلة محاولة...التقاط عن طريق وضع هذا الكود في main.jsp:
<html><head> <title>جرب...التقاط المثال</title></head><body><%try{ int i = 1; + i); } Catch (Exception e){ out.println("حدث استثناء: " + e.getMessage() } %></body></html>
حاول الدخول إلى main.jsp، فسيظهر لك النتائج التالية:
حدث استثناء: / بمقدار صفر