Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

كتلة 'finally'

جزء من قسم Logic & Flow في رحلة Dart على Coddy — الدرس 41 من 65.

أحيانًا تحتاج إلى كود يتم تشغيله بغض النظر عما يحدث في كتلة try-catch الخاصة بك. تخدم كتلة finally هذا الغرض تمامًا - فهي تحتوي على كود يتم تنفيذه دائمًا، سواء حدث استثناء أم لا.

يأتي المقطع البرمجي finally بعد المقطعين البرمجيين try و catch. حتى لو تم تشغيل الكود الخاص بك بنجاح في قسم try، أو إذا تم التقاط استثناء ومعالجته، فسيظل المقطع البرمجي finally قيد التنفيذ.

try {
  // الكود الذي قد يتسبب في حدوث استثناء
  int result = 10 ~/ 2;
  print("Result: $result");
} catch (e) {
  print("An error occurred: $e");
} finally {
  print("This always runs!");
}

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

challenge icon

التحدي

سهل

قم بإنشاء برنامج يوضح استخدام كتلة finally من خلال تنفيذ محاكي لمعالجة الملفات يقوم دائماً بعمليات التنظيف بغض النظر عما إذا كان قد حدث خطأ أثناء المعالجة أم لا.

  1. اقرأ مدخلاً نصياً يمثل اسم الملف المراد معالجته
  2. اقرأ مدخلاً نصياً يمثل محتوى الملف
  3. اقرأ مدخلاً نصياً يمثل ما إذا كان سيتم محاكاة خطأ ("error" أو "success")
  4. استخدم هيكل try-catch-finally لمحاكاة معالجة الملف:
    • في كتلة try: تحقق مما إذا كانت محاكاة الخطأ هي "error" وقم برمي استثناء (exception) مع الرسالة "File processing failed" إذا كان ذلك صحيحاً، وإلا فقم بمعالجة الملف بنجاح
    • في كتلة catch: تعامل مع أي استثناء يحدث أثناء المعالجة
    • في كتلة finally: قم دائماً بإجراء عمليات التنظيف بغض النظر عن النجاح أو الفشل
  5. اعرض نتائج المعالجة بالتنسيق الدقيق الموضح أدناه

على سبيل المثال، إذا كانت المدخلات هي "document.txt"، و "Hello World"، و "success"، يجب أن يكون مخرج برنامجك:

File Processing System
======================
Opening file: document.txt
File content: Hello World
Processing file successfully...
File processed: 11 characters found
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed successfully

إذا كانت المدخلات هي "report.pdf"، و "Annual Report Data"، و "error"، يجب أن يكون مخرج برنامجك:

File Processing System
======================
Opening file: report.pdf
File content: Annual Report Data
Error occurred: File processing failed
Unable to complete file processing
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed with errors

إذا كانت المدخلات هي "config.json"، و "{\"setting\": \"value\"}"، و "success"، يجب أن يكون مخرج برنامجك:

File Processing System
======================
Opening file: config.json
File content: {"setting": "value"}
Processing file successfully...
File processed: 19 characters found
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed successfully

يجب أن يستخدم برنامجك هيكل try-catch-finally حيث تقوم كتلة finally دائماً بتنفيذ عمليات التنظيف الثلاث بالترتيب الدقيق الموضح. في كتلة try، تحقق مما إذا كان مدخل محاكاة الخطأ يساوي "error" وقم برمي استثناء إذا كان ذلك صحيحاً. إذا لم يتم محاكاة أي خطأ، فقم بعد الأحرف في محتوى الملف باستخدام خاصية length. يجب أن تقوم كتلة finally دائماً بطباعة رسائل التنظيف وتحديد حالة الإكمال النهائية بناءً على ما إذا كان قد حدث خطأ أم لا.

ورقة مرجعية

تحتوي كتلة finally على كود يتم تنفيذه دائماً بعد try-catch، بغض النظر عما إذا كان قد حدث استثناء أم لا.

try {
  // كود قد يتسبب في حدوث استثناء
  int result = 10 ~/ 2;
  print("Result: $result");
} catch (e) {
  print("An error occurred: $e");
} finally {
  print("This always runs!");
}

تُعد كتلة finally مثالية لعمليات التنظيف مثل إغلاق الملفات، أو تحرير الموارد، أو تسجيل حالة الإكمال.

جرّب بنفسك

import 'dart:io';

void main() {
  // قراءة المدخلات
  String? filename = stdin.readLineSync();
  String? content = stdin.readLineSync();
  String? errorSimulation = stdin.readLineSync();
  
  // عرض ترويسة النظام
  print("File Processing System");
  print("======================");
  print("Opening file: $filename");
  print("File content: $content");
  
  // TODO: اكتب الكود الخاص بك أدناه
  // استخدم هيكل try-catch-finally لمحاكاة معالجة الملفات
  // - في كتلة try: تحقق مما إذا كان errorSimulation يساوي "error" وقم برمي استثناء إذا كان ذلك صحيحاً
  // - في كتلة catch: قم بمعالجة أي استثناء
  // - في كتلة finally: قم دائماً بإجراء عمليات التنظيف
  
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow