try/catch/finally وthrow new مقابل إعادة الرمي
استخدم try/catch/finally لمعالجة الأخطاء بصورة متوقعة؛ وافهم الفرق بين throw new وإعادة الرمي؛ وحافظ على صغر الأمثلة وتركيزها.
try/catch/finally وthrow new مقابل إعادة الرمي درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 3 دروس في المجموع.
نظرة عامة على الاستثناءات
الهدف: معالجة الأخطاء وتمريرها بأمان.
- try/catch: معالجة استثناءات محددة
- finally: يُنفَّذ دائمًا لأغراض التنظيف
- throw new مقابل إعادة الرمي
- اجعل المعالجات قصيرة؛ ولا تخفِ الأخطاء
التقاط استثناء محدد
التقط الاستثناء الأكثر تحديدًا الذي تتوقعه؛ واجعل المعالج قصيرًا وواضحًا.
using System;
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Start");
try
{
int x = 10;
int y = 0; // will cause DivideByZeroException
Console.WriteLine(x / y);
}
catch (DivideByZeroException ex)
{
Console.WriteLine("Cannot divide by zero: " + ex.GetType().Name);
}
Console.WriteLine("Continue");
}
}
ترتيب عمليات الالتقاط
الترتيب مهم: ضع عمليات الالتقاط المحددة أولًا، ثم عملية التقاط عامة لـ Exception في النهاية كشبكة أمان.
using System;
public class Program
{
static int ParseAndDivide(string text, int divisor)
{
// Throws FormatException or DivideByZeroException
int value = int.Parse(text);
return value / divisor;
}
public static void Main(string[] args)
{
try
{
Console.WriteLine(ParseAndDivide("not-a-number", 2));
}
catch (FormatException)
{
Console.WriteLine("Bad number format");
}
catch (Exception ex)
{
// Fallback last
Console.WriteLine("Other error: " + ex.GetType().Name);
}
}
}
استخدام finally للتنظيف
ضع عمليات التنظيف في finally. فهو يُنفَّذ سواء حدث استثناء أم لا.
using System;
public class Program
{
static bool opened = false;
static void UseFakeResource()
{
try
{
opened = true;
Console.WriteLine("Open");
throw new InvalidOperationException("boom");
}
catch (InvalidOperationException)
{
Console.WriteLine("Handled");
}
finally
{
opened = false; // cleanup path
Console.WriteLine("Close");
}
}
public static void Main(string[] args)
{
UseFakeResource();
Console.WriteLine("Opened? " + opened);
}
}
إعادة الرمي بشكل صحيح
استخدم throw; لإعادة الرمي مع الحفاظ على المكدس الأصلي. أما throw ex; فيعيد تعيينه. غلّف الاستثناء باستثناء جديد فقط عند إضافة سياق.
using System;
public class Program
{
static void BadRethrow()
{
try
{
Fail();
}
catch (Exception ex)
{
// Resets stack trace:
throw ex; // BAD rethrow
}
}
static void GoodRethrow()
{
try
{
Fail();
}
catch
{
// Preserves original stack trace:
throw; // GOOD rethrow
}
}
static void Fail()
{
throw new InvalidOperationException("fail");
}
public static void Main(string[] args)
{
try { BadRethrow(); }
catch (Exception ex)
{
Console.WriteLine("Bad: " + (ex.StackTrace == null ? "no stack" : "stack reset likely"));
}
try { GoodRethrow(); }
catch (Exception ex)
{
Console.WriteLine("Good: preserves original stack");
}
}
}
إرشادات المعالجة
الإرشادات:
- التقط الاستثناء عندما تتمكن من معالجته أو إضافة سياق.
- وإلا، دعه يتصاعد.
- اجعل المعالجات صغيرة؛ وتجنب ابتلاع الاستثناءات بصمت.
- استخدم finally للتنظيف؛ وسيأتي التخلص من الموارد في الدرس التالي.
قاعدة إعادة الرمي
مراجعة
مراجعة: استخدم try/catch للأخطاء المحددة، وfinally للتنظيف، وفضّل throw; عند إعادة الرمي للحفاظ على المكدس الأصلي.
الأسئلة الشائعة
هل درس «try/catch/finally وthrow new مقابل إعادة الرمي» مجاني؟
نعم — نص درس «try/catch/finally وthrow new مقابل إعادة الرمي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 3 دروس في المجموع.
ماذا ستتعلم في «try/catch/finally وthrow new مقابل إعادة الرمي»؟
استخدم try/catch/finally لمعالجة الأخطاء بصورة متوقعة؛ وافهم الفرق بين throw new وإعادة الرمي؛ وحافظ على صغر الأمثلة وتركيزها. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 3.
كم من الوقت يستغرق درس «try/catch/finally وthrow new مقابل إعادة الرمي»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- try/catch/finally وthrow new مقابل إعادة الرمي
- الاستثناءات المخصصة وتصميم الأخطاء
- IDisposable وعبارة using