تخطَّ إلى المحتوى

try / catch / finally

كتلة try/catch/finally try / catch / finally

try تحيط بالكود القابل للفشل، catch تلتقط نوعًا محدّدًا من الاستثناءات وتتعامل معه، وfinally تُنفَّذ دائمًا لتنظيف الموارد.

الكود داخل try يُراقَب أثناء التنفيذ. إن رُمي استثناء، يقفز التنفيذ لأول كتلة catch تطابق نوع الاستثناء (أو نوعًا أعمّ منه)، بدل إيقاف البرنامج بالكامل.

katch متعدّدة تُفحص من الأعلى للأسفل، لذا ضع الأنواع المحدّدة أولًا والعامّة (Exception) أخيرًا. finally تُنفَّذ دائمًا — سواء رُمي استثناء أو لا — مناسبة لإغلاق ملف أو اتصال حتى لو فشلت العملية.

الصياغة

try
{
    // كود قد يفشل
}
catch (SpecificException ex)
{
    // معالجة محدّدة
}
finally
{
    // ينفّذ دائمًا
}

📄 مثال

try
{
    int result = 10 / int.Parse("0");
}
catch (DivideByZeroException)
{
    Console.WriteLine("لا يمكن القسمة على صفر");
}
catch (Exception ex)
{
    Console.WriteLine($"خطأ غير متوقع: {ex.Message}");
}
finally
{
    Console.WriteLine("انتهت المحاولة");
}

أهم النقاط

العنصرالوظيفة
tryالكود المراقَب
catch (Type ex)يلتقط نوعًا محدّدًا — الأكثر تحديدًا أولًا
finallyينفّذ دائمًا، حتى مع return داخل try

💡 نصائح عملية

  • استخدم using بدل finally يدوي للتخلّص من كائنات IDisposable

⚠️ أخطاء شائعة

  • التقاط catch (Exception) فارغة تبتلع كل الأخطاء بصمت — يصعّب التشخيص لاحقًا
  • وضع catch عامّة قبل catch محدّدة — يمنع الوصول للمحدّدة أبدًا

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CSHARP الكامل بالعربي.