معالجة الأخطاء في Java: try/catch وما بعدها - دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

معالجة الأخطاء في Java: try/catch وما بعدها: من الألف إلى الياء



معالجة الأخطاء هي أحد المفاهيم الأساسية في Java والتي يجب على كل مطور إتقانها. على عكس العديد من اللغات، تقدم Java نظام استثناءات (exceptions) صارمًا ومدروسًا جيدًا، مما يسمح بكتابة كود موثوق ويمكن التنبؤ به. في هذه المقالة، سنشرح كل شيء: من try/catch الأساسي إلى الآليات المتقدمة مثل try-with-resources والاستثناءات المخصصة.



1. الأساسيات: ما هي الاستثناءات والتسلسل الهرمي للفئات



الاستثناء (exception) هو حدث يعطل التدفق الطبيعي لتنفيذ البرنامج. في Java، جميع الاستثناءات هي كائنات لفئات ترث من Throwable. الفروع الرئيسية للتسلسل الهرمي:



  • Error — مشاكل حرجة لا تتم معالجتها عادةً (مثل OutOfMemoryError).
  • Exception — استثناءات يمكن للبرنامج معالجتها.
  • RuntimeException (فئة فرعية من Exception) — استثناءات وقت التشغيل التي لا يلزم التحقق منها في مرحلة التجميع.


تنقسم جميع الاستثناءات إلى نوعين:

  • Checked (محققة) — إلزامية المعالجة. لن يسمح المترجم بتجميع الكود إذا لم تقم بمعالجتها باستخدام try/catch أو لم تعلن عنها باستخدام throws. أمثلة: IOException, SQLException.
  • Unchecked (غير محققة) — ترث من RuntimeException. لا يلزم معالجتها بشكل صريح. أمثلة: NullPointerException, ArithmeticException.


2. الآلية الأساسية: try, catch, finally



تتكون الكتلة الأساسية لمعالجة الاستثناءات من ثلاثة أجزاء:



try {    // الكود الذي قد يرمي استثناءً    int result = 10 / 0;} catch (ArithmeticException e) {    // معالجة الاستثناء    System.err.println("خطأ: القسمة على صفر!");} finally {    // يتم تنفيذ هذه الكتلة دائمًا (حتى في حالة وجود استثناء)    System.out.println("تم تنفيذ كتلة finally.");}


نقاط مهمة:

  • يمكن أن تكون كتلة catch واحدة أو متعددة لأنواع مختلفة من الاستثناءات.
  • كتلة finally اختيارية، ولكنها مفيدة لإغلاق الموارد (الملفات، الاتصالات).
  • إذا لم يتم التقاط الاستثناء، فسيتم تمريره لأعلى مكدس الاستدعاءات.


Multi-catch (Java 7+) — يسمح بالتقاط أنواع متعددة من الاستثناءات في كتلة واحدة:



try {    // كود} catch (IOException | SQLException e) {    System.err.println("خطأ إدخال/إخراج أو SQL: " + e.getMessage());}


3. Try-with-resources: الإغلاق التلقائي للموارد



بدءًا من Java 7، ظهرت آلية try-with-resources التي تغلق تلقائيًا الموارد التي تطبق واجهة AutoCloseable (أو Closeable). هذا يلغي الحاجة إلى كتابة finally لإغلاق الملفات، والمآخذ، إلخ.



try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {    String line = reader.readLine();    System.out.println(line);} catch (IOException e) {    System.err.println("خطأ في قراءة الملف: " + e.getMessage());} // يتم إغلاق reader تلقائيًا


المزايا:

  • يصبح الكود أنظف وأقصر.
  • يتم إغلاق الموارد بالترتيب الصحيح (عكس ترتيب إنشائها).
  • إذا تم رمي استثناء في كتلة try وأثناء الإغلاق، فسيتم إضافة الاستثناء المكبوت (suppressed) إلى الاستثناء الرئيسي.


يمكنك الإعلان عن موارد متعددة باستخدام الفاصلة المنقوطة:



try (BufferedReader br = new BufferedReader(new FileReader("in.txt"));     BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"))) {    // معالجة الملفات} catch (IOException e) {    System.err.println("خطأ في معالجة الملف: " + e.getMessage());}

المدونات

توصيات الكتب