English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في المقطع السابق، رأينا كيفية التعامل مع الاستثناءات التي تُثار تلقائيًا بواسطة CLR. هنا، سنرى كيف يمكن إثارة الاستثناءات يدويًا.
يمكنك استخدام كلمة المفتاح throw لتحفيز الاستثناء يدويًا. يمكنك استخدام كلمة المفتاح throw لتحفيز استثناءات مُتفرعة من الصنفExceptionأي نوع من الأنواع المُتفرعة من الصنف.
استاتيك void Main(string[] args) { Student std = null; حاول { PrintStudentName(std); } catch(Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); } private static void PrintStudentName(Student std) { إذا (std == null) إرمثِ new NullReferenceException("موضوع Student null"); Console.WriteLine(std.StudentName); }
موضوع Student null
في المثال السابق، إذا كان موضوع Student null، فإن طريقة PrintStudentName() ترمي NullReferenceException.
لاحظ أن كلمة المفتاح throw تقوم بإنشاء أي نوع من استثناءات النوع الصالح باستخدام الكلمة المفتاح new. لا يمكن استخدام كلمة المفتاح throw مع أي نوع آخر غير النوع الذي يُتفرع منه من صنف Exception.
يمكنك أيضًا إعادة رمي الاستثناء من بلاك catch لتقديمه إلى صاحب الطلب، وإعطائه الفرصة لتعامل معه بالطريقة المطلوبة. يتم عرض ذلك في المثال التالي.
استاتيك void Main(string[] args) { حاول { Method1(); } catch(Exception ex) { Console.WriteLine(ex.StackTrace); } } استاتيك void Method1() { حاول { Method2(); } catch(Exception ex) { throw; } } استاتيك void Method2() { السلسلة str = null; حاول { Console.WriteLine(str[0]); } catch(Exception ex) { throw; } }
في المثال السابق، حدث استثناء في Method2(). يستخدم كلاً من البлокات catch المفتوحة فقط كلمة المفتاح throw (بدلاً من throw e) لإعادة رمي الاستثناء. سيتم التعامل مع ذلك في بلاك catch في Method1()، حيث يتم إعادة رميه مرة أخرى بنفس الاستثناء، وأخيرًا يتم التعامل معه في طريقة Main(). سيعطيك تتبع ال堆栈 هذا المكان والمعلومات الكاملة حول الاستثناء.
إذا تم استخدام معاملات الاستثناء لإعادة رمي الاستثناء، فإنه لن يحتفظ بالاستثناء الأصلي ويقوم بإنشاء استثناء جديد. يتم عرض ذلك في المثال التالي.
استاتيك void Main(string[] args) { حاول { Method1(); } catch(Exception ex) { Console.WriteLine(ex.StackTrace); } } استاتيك void Method1() { حاول { Method2(); } catch(Exception ex) { إرمثِ ex; } } استاتيك void Method2() { السلسلة str = null; حاول { Console.WriteLine(str[0]); } catch(Exception ex) { throw; } }
في المثال السابق، الاستثناء الذي تم إلتقاطه في دالة Main () سيظهر مسار التتبع من دالة Method1 و Main. عند استخدامنا لـ throw ex مرة أخرى في Method1()، لن يظهر Method1 في مسار التتبع. لذلك، لا تستخدم أبدًا throw < parameter exception > لرمي الاستثناءات.
في الفقرة التالية، ستعرف كيفية إنشاء نوع استثناء مخصص.