logo

الاستثناءات المتسلسلة في جافا

تسمح الاستثناءات المتسلسلة في 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 هي رسالة الاستثناء والسبب هو الاستثناء الذي يسبب الاستثناء الحالي.

طرق دعم الاستثناءات المتسلسلة

  1. الحصول على السبب () : تقوم هذه الطريقة بإرجاع السبب الفعلي للاستثناء.
  2. 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);  }  } } 

الإخراج:

حساب المدة في الاكسل
الإخراج' title=

توضيح: في هذا المثال، مجموعة من الأعداد الصحيحة وتعيين المقسوم عليه على 0.

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

مزايا الاستثناءات المتسلسلة:

مزايا الاستثناءات المتسلسلة مذكورة أدناه:

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

مساوئ الاستثناءات المتسلسلة:

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