تسمح الاستثناءات المتسلسلة في Java بربط استثناء واحد بآخر، أي أن استثناء واحد يصف سبب استثناء آخر.
- على سبيل المثال، ضع في اعتبارك موقفًا تُلقي فيه إحدى الطرق ملفًا استثناء حسابي بسبب محاولة القسمة على صفر.
- ولكن السبب الجذري للخطأ هو فشل الإدخال/الإخراج الذي جعل المقسوم عليه صفرًا.
- في مثل هذه الحالات، تساعد الاستثناءات المتسلسلة على نشر الأسباب الأساسية والأساسية للخطأ.
مثال : يوضح المثال التالي كيفية استخدام الاستثناءات المتسلسلة في Java.
Java// Working of chained exceptions public class Geeks { public static void main(String[] args) { try { // Creating an exception NumberFormatException ex = new NumberFormatException('Primary Exception'); // Setting the cause of the exception ex.initCause(new NullPointerException('Root cause of the exception')); // Throwing the exception with a cause throw ex; } catch (NumberFormatException ex) { // Displaying the primary exception System.out.println('Caught Exception: ' + ex); // Displaying the root cause of the exception System.out.println('Cause of Exception: ' + ex.getCause()); } } }
الإخراج
Caught Exception: java.lang.NumberFormatException: Primary Exception Cause of Exception: java.lang.NullPointerException: Root cause of the exception
ملحوظة: تسمح لنا الاستثناءات المتسلسلة والمعروفة أيضًا باسم الاستثناءات المتداخلة بربط سبب مع استثناء في Java. يكون هذا مفيدًا عندما نريد نشر معلومات حول السبب الأصلي للاستثناء.
البنائين
- قابل للرمي (سبب قابل للرمي) : حيث يكون السبب هو الاستثناء الذي يسبب الاستثناء الحالي.
- رمي (سلسلة رسالة سبب رمي) : حيث msg هي رسالة الاستثناء والسبب هو الاستثناء الذي يسبب الاستثناء الحالي.
طرق دعم الاستثناءات المتسلسلة
- الحصول على السبب () : تقوم هذه الطريقة بإرجاع السبب الفعلي للاستثناء.
- initCause (سبب قابل للرمي) : تحدد هذه الطريقة سبب استثناء الاستدعاء.
مثال: استخدام رسالة مخصصة مع استثناءات متسلسلة
في Java، يمكننا ربط الاستثناءات باستخدام مُنشئ فئة Throwable.
Java// Use a custom message with chained exception public class Geeks { public static void main(String[] args) { try { // Code that might throw an exception int[] n = new int[5]; int divisor = 0; for (int i = 0; i < n.length; i++) { int res = n[i] / divisor; System.out.println(res); } } catch (ArithmeticException e) { // Creating a new exception with // the original as the cause throw new RuntimeException ('Error: Division by zero occurred' e); } } }
الإخراج:
حساب المدة في الاكسل
توضيح: في هذا المثال، مجموعة من الأعداد الصحيحة وتعيين المقسوم عليه على 0.
- داخل كتلة المحاولة، تحاول تقسيم كل عنصر من عناصر المصفوفة على 0 مما يؤدي إلى ظهور استثناء حسابي.
- تم اكتشاف ArithmeticException في كتلة الالتقاط حيث يتم إنشاء RuntimeException جديد مع الاستثناء الأصلي، أي ArithmeticException كسبب له.
- نظرًا لعدم اكتشاف RuntimeException الذي يعرض تتبع المكدس بما في ذلك RuntimeException وArithmeticException.
مزايا الاستثناءات المتسلسلة:
مزايا الاستثناءات المتسلسلة مذكورة أدناه:
- يساعد هذا الاستثناء في تصحيح الأخطاء من خلال توفير تفاصيل حول الأسباب الأساسية والجذرية.
- إنه يبسط معالجة الأخطاء عن طريق تمكين نشر سياق الاستثناء الكامل.
- يؤدي ذلك إلى تحسين إمكانية تتبع الأخطاء في التطبيقات المعقدة.
مساوئ الاستثناءات المتسلسلة:
- إذا لم يتم استخدامه بشكل صحيح، فقد يجعل تتبع المكدس أطول وأصعب في القراءة.
- قد يؤدي الإفراط في الاستخدام إلى ظهور رسائل خطأ مربكة إذا كانت الاستثناءات متسلسلة بشكل غير ضروري.
- يجب على المطورين التأكد من ربط الأسباب ذات المغزى؛ وإلا فإنه يمكن تضليل أثناء التصحيح.