هل يجب علي استخلاص استثناءات مخصصة من Exception أو ApplicationException في .NET؟
سؤال
ما هي أفضل الممارسات عند إنشاء فئات الاستثناء الخاصة بك في حل .NET:لتستمد من System.Exception
او من System.ApplicationException
?
المحلول
وفقًا لجيفري ريختر في كتاب إرشادات تصميم الإطار:
System.ApplicationException
هي فئة لا ينبغي أن تكون جزءًا من إطار عمل .NET.
كان المقصود منه أن يكون له معنى ما حيث أنه من المحتمل أن تتمكن من التقاط "جميع" استثناءات التطبيق، ولكن لم يتم اتباع النمط وبالتالي ليس له أي قيمة.
نصائح أخرى
يجب عليك استخلاص استثناءات مخصصة من System.Exception
.
حتى MSDN يقول الآن للتجاهل ApplicationException
:
إذا كنت تقوم بتصميم تطبيق يحتاج إلى إنشاء استثناءات خاصة به ، يُنصح باستخلاص استثناءات مخصصة من فئة الاستثناء.كان يعتقد في الأصل أن الاستثناءات المخصصة يجب أن تستمد من فئة ApplicationException ؛ولكن في الممارسة العملية لم يتم العثور على هذا لإضافة قيمة كبيرة.لمزيد من المعلومات، راجع أفضل الممارسات للتعامل مع الاستثناءات.
http://msdn.microsoft.com/en-us/library/system.applicationexception.aspx
ApplicationException
تعتبر عديمة الفائدة هي حجة قوية وحاسمة ضد ApplicationException
.
النتيجة:لا تستخدمه.يشتق من Exception
.
يعتبر مؤلفو الإطار أنفسهم أن ApplicationException لا قيمة له:
http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx
مع متابعة لطيفة هنا:
http://blogs.msdn.com/kcwalina/archive/2006/07/05/657268.aspx
عندما تكون في شك، أتبع كتابهم المبادئ التوجيهية لتصميم الإطار.
http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756
تمت مناقشة موضوع مشاركة المدونة بشكل أكبر هناك.
روبية
أنا معتاد على القيام بما يلي:
private void buttonFoo_Click()
{
try
{
foo();
}
catch(ApplicationException ex)
{
Log.UserWarning(ex);
MessageVox.Show(ex.Message);
}
catch(Exception ex)
{
Log.CodeError(ex);
MessageBox.Show("Internal error.");
}
}
انها تسمح للقيام بالفرق بين:
- خطأ في نظام كود C# يجب علي إصلاحه.
- خطأ مستخدم "عادي" لا يحتاج إلى تصحيح مني.
أعلم أنه لا يُنصح باستخدام ApplicationException، لكنه يعمل بشكل رائع نظرًا لوجوده عدد قليل جدا من الفصول التي لا تحترم نمط ApplicationException.