كيفية التقاط استثناءات متعددة في C#: دليل كامل

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

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

ابدأ الدورة

التقاط دفعة واحدة: كيفية التقاط استثناءات متعددة في C# بدون تكرار الكود

\n\n

تخيل: أنت تكتب تطبيقًا يعمل مع الملفات والشبكة وقواعد البيانات. في دالة واحدة قد يظهر FileNotFoundException أو IOException أو UnauthorizedAccessException. النهج التقليدي هو ثلاث كتل catch بنفس الكود بداخلها. هذا ينتهك مبدأ DRY (لا تكرر نفسك) ويحول الكود إلى "سباغيتي".

\n\n

الخبر السار: في C# هناك عدة طرق أنيقة لالتقاط استثناءات متعددة دفعة واحدة. في هذا الدليل التعليمي سنستعرض جميع الخيارات - من الأساسية إلى المتقدمة - وستتعلم كيفية كتابة كود نظيف وقابل للصيانة لمعالجة الأخطاء.

\n\n

لماذا هذا مهم؟ سيناريو واقعي

\n\n

لنفترض أنك تطور تطبيق وحدة تحكم للنسخ الاحتياطي. يقرأ الملفات، يضغطها ويرسلها إلى خادم بعيد. في كل مرحلة قد تظهر استثناءات مختلفة:

\n\n
    \n
  • قراءة الملف: FileNotFoundException، PathTooLongException
  • \n
  • الضغط: OutOfMemoryException
  • \n
  • الإرسال: HttpRequestException، TimeoutException
  • \n
\n\n

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

\n\n

الطريقة 1. التقليدية: عدة كتل catch (قبل C# 6)

\n\n

أبسط وأوضح طريقة هي كتابة عدة كتل catch متتالية. C# سيختار الكتلة المناسبة بناءً على نوع الاستثناء:

\n\n
try\n{\n    // كود قد يرمي استثناءات مختلفة\n    string content = File.ReadAllText(@"C:\\data\\config.txt");\n    int value = int.Parse(content);\n    await SendToServerAsync(value);\n}\ncatch (FileNotFoundException ex)\n{\n    Console.WriteLine($"الملف غير موجود: {ex.Message}");\n    LogError(ex);\n}\ncatch (FormatException ex)\n{\n    Console.WriteLine($"تنسيق بيانات غير صحيح: {ex.Message}");\n    LogError(ex);\n}\ncatch (HttpRequestException ex)\n{\n    Console.WriteLine($"خطأ في الشبكة: {ex.Message}");\n    LogError(ex);\n}
\n\n

الإيجابيات: واضح، سهل القراءة، يمكن معالجة كل استثناء بطريقته الخاصة.
\nالسلبيات: إذا كانت الإجراءات متطابقة - تكرار الكود.

\n\n

الطريقة 2. التقاط استثناءات متعددة في catch واحد (C# 6+)

\n\n

بدءًا من C# 6، يمكنك سرد عدة أنواع من الاستثناءات باستخدام | في كتلة catch واحدة. هذا يقلل التكرار ويحافظ على قابلية القراءة:

\n\n
try\n{\n    // كود محفوف بالمخاطر\n}\ncatch (FileNotFoundException | FormatException | HttpRequestException ex)\n{\n    Console.WriteLine($"حدث خطأ: {ex.Message}");\n    LogError(ex);\n    // منطق إضافي مشترك لجميع الأنواع الثلاثة\n}
\n\n

هام: يجب أن تكون جميع الاستثناءات متوافقة هرميًا. لا يمكن خلط مثلاً IOException و NullReferenceException - فهما غير مرتبطين بسلف مشترك باستثناء Exception. لكن في C# 6+ هذا مسموح، المترجم ببساطة سيحول المتغير ex إلى النوع الأساسي المشترك.

\n\n

متى تستخدم هذه الطريقة؟

\n
    \n
  • عندما يكون منطق المعالجة متطابقًا لجميع الاستثناءات.
  • \n
  • عندما تريد تجنب كتل if أو switch المتداخلة.
  • \n
  • في الدوال الصغيرة حيث تكون الإيجاز مهمًا.
  • \n
\n\n

الطريقة 3. فلاتر الاستثناءات (C# 6+)

\n\n

فلاتر الاستثناءات هي آلية قوية تسمح بالتقاط الاستثناءات بناءً على شرط باستخدام الكلمة المفتاحية when. يمكنك التقاط نفس الاستثناء ولكن بمنطق مختلف اعتمادًا على خصائصه:

\n\n
try\n{                

المدونات

توصيات الكتب