Exception Handling

🔹 التعامل مع الأخطاء (Exception Handling) في Dart 🚀

في Dart، يمكن أن تحدث الأخطاء (Exceptions) أثناء تشغيل البرنامج، مما قد يؤدي إلى توقفه بشكل غير متوقع.
لذلك، توفر Dart آلية للتعامل مع هذه الأخطاء باستخدام الكلمات المفتاحية:

try → لتجربة تنفيذ الكود.
catch → لالتقاط الأخطاء عند حدوثها.
on → لمعالجة نوع معين من الأخطاء فقط.
finally → لتنفيذ كود بغض النظر عن حدوث خطأ أو لا.
throw → لرمي (throw) استثناء يدويًا.


🔹 try - catch

تستخدم try - catch لتجنب توقف البرنامج عند حدوث خطأ.

📌 مثال: try - catch للتعامل مع القسمة على صفر

dartنسختحرير<code>void main() {
  try {
    int result = 10 ~/ 0; // ❌ خطأ: القسمة على صفر
    print(result);
  } catch (e) {
    print("حدث خطأ: $e"); // ✅ معالجة الخطأ
  }
}
</code>
Dart

🔹 التفسير:

  • try تحاول تنفيذ 10 ~/ 0، ولكن القسمة على صفر تسبب خطأ (IntegerDivisionByZeroException).
  • catch (e) تلتقط الخطأ وتمنع توقف البرنامج.

الناتج:

نسختحرير<code>حدث خطأ: IntegerDivisionByZeroException
</code>
Dart

🔹 try - on - catch

🔹 on يستخدم لمعالجة نوع معين من الأخطاء.
🔹 catch يستخدم لالتقاط أي خطأ غير محدد.

📌 مثال: on لمعالجة خطأ محدد

dartنسختحرير<code>void main() {
  try {
    int result = 10 ~/ 0;
    print(result);
  } on IntegerDivisionByZeroException {
    print("❌ خطأ: لا يمكنك القسمة على صفر");
  } catch (e) {
    print("⚠️ خطأ غير معروف: $e");
  }
}
</code>
Dart

🔹 التفسير:

  • on IntegerDivisionByZeroException يعالج خطأ القسمة على صفر.
  • catch (e) تلتقط أي خطأ آخر غير محدد.

الناتج:

نسختحرير❌ خطأ: لا يمكنك القسمة على صفر

🔹 try - catch - finally

🔹 finally يستخدم لتنفيذ كود سواء حدث خطأ أم لا.

📌 مثال: finally دائمًا يُنفذ

dartنسختحرير<code>void main() {
  try {
    int result = 10 ~/ 2;
    print("النتيجة: $result");
  } catch (e) {
    print("حدث خطأ: $e");
  } finally {
    print("✅ هذا الكود يُنفذ دائمًا سواء حدث خطأ أم لا");
  }
}
</code>
Dart

الناتج:

makefileنسختحرير<code>النتيجة: 5
✅ هذا الكود يُنفذ دائمًا سواء حدث خطأ أم لا
</code>
Dart

🔹 throw لرمي استثناءات مخصصة

🔹 يمكننا استخدام throw لإنشاء أخطاء مخصصة (Custom Exceptions).

📌 مثال: رمي خطأ مخصص

dartنسختحرير<code>void checkAge(int age) {
  if (age < 18) {
    throw Exception("❌ لا يمكنك التسجيل، العمر يجب أن يكون 18 أو أكثر");
  } else {
    print("✅ مرحبًا بك! يمكنك التسجيل.");
  }
}

void main() {
  try {
    checkAge(16); // ❌ سيرمي خطأ
  } catch (e) {
    print("حدث خطأ: $e");
  }
}
</code>
Dart

الناتج:

phpنسختحريرحدث خطأ: Exception: ❌ لا يمكنك التسجيل، العمر يجب أن يكون 18 أو أكثر

🔹 إنشاء استثناء مخصص (Custom Exception)

يمكنك إنشاء كلاسات (Classes) مخصصة لرمي أخطاء محددة.

📌 مثال: استثناء مخصص

dartنسختحرير<code>class AgeException implements Exception {
  String errorMessage() => "❌ العمر غير صالح!";
}

void checkAge(int age) {
  if (age < 18) {
    throw AgeException();
  } else {
    print("✅ مرحبًا بك!");
  }
}

void main() {
  try {
    checkAge(15); // ❌ سيرمي استثناء مخصص
  } catch (e) {
    print(e.errorMessage()); // ✅ طباعة رسالة الخطأ
  }
}
</code>
Dart

الناتج:

نسختحرير❌ العمر غير صالح!

🎯 خلاصة Exception Handling في Dart

try → يحاول تنفيذ الكود.
catch (e) → يلتقط أي خطأ ويمنع توقف البرنامج.
on → يعالج نوع معين من الأخطاء فقط.
finally → يتم تشغيله دائمًا سواء حدث خطأ أم لا.
throw → يستخدم لرمي خطأ يدويًا.
Custom Exception → يمكن إنشاء استثناءات مخصصة (Classes).