تحديد فئات وأنواع متعددة من الأخطاء
يتم وضع عبارات الخطأ قبل الاختبار لإملاء ما يجب عرضه عند نجاح الاختبار أو فشله. يمكنُك معالجة الأخطاء باستخدام العبارات Throw وTry...catch وFinally وRetry لمعالجة الاستثناءات. الاستثناء هو انتقال سريع منظم بعيدًا عن تشغيل الكود.
تُستخدم الكلمة الأساسية throw لطرح قيمة تعداد استثنائية. على سبيل المثال، سيتم استخدام العبارة throw Exception::error; لطرح استثناء خطأ. نوصي باستخدام الطريقة Global::error بدلاً من Exception::error. يمكن للطريقة Global::error كتابة رسالة إلى سجل المعلومات عند طرح استثناء خطأ وتحويل التسمية إلى نص تلقائيًا. يمكنُك أيضًا كتابة Global::error("Error message.") بالطريقة error("Error message.").
تُستخدم الكلمات الأساسية try...catch لمعالجة استثناء تم طرحه من خلال الالتقاط. يتم تشغيل الكود فِي كتلة الكود try.
فِي حالة طرح خطأ، سيقوم الكود بالانتقال السريع إلى تشغيل كتل كود الالتقاط بشكل تسلسلي لمعرفة ما إذا تم تحديد الخطأ الذي تم طرحه لمعالجة الخطأ. ويُعد من الممارسات الشائعة أن تجعل عبارة الالتقاط تقوم بمعالجة قيمة التعداد Exception::Error وترك عبارة التقاط واحدة فارغة لالتقاط أي خطأ غير محدد. يمكن استخدام الكلمة الأساسية Finally مع عبارة Try...catch. سيتم تشغيل الكود الموجود فِي كتلة الكود finally عندما يترك الكود الكتلة try إما بشكل عادي أو بسبب حدوث خطأ. انظر الكود فِي المثال الآتي:
try
{
// Code here.
}
catch (Exception::Numeric)
{
info("Caught a Numeric exception.");
}
catch
{
info("Caught an exception.");
}
finally
{
// Executed no matter how the try block exits.
}
يمكن كتابة الكلمة الأساسية retry فقط فِي الكتلة catch. ويؤدي ذلك إلى انتقال الكود مرة أخرى إلى أول سطر فِي كتلة الكود try. يجب استخدام retry عندما يمكن حل المشكلة من خلال الكود. تعمل الكتلة retry على منح الكود فرصة إضافِية للنجاح وتعرض سجل معلومات عندما يتم بدء تشغيل الكتلة try. يجب أن تتأكد من أن عبارة retry لا تتسبب فِي تكرار لا نهائي. نوصي بتضمين متغير فِي الكتلة try لاختباره إذا كنت فِي حلقة لا نهائية.
يمكنُك طرح العديد من استثناءات الخطأ:
- Break -قام المستخدم بالضغط على Break أو Ctrl + C.
- CLRError - حدث الخطأ فِي أثناء استخدام وظيفة CLR.
- CodeAccessSecurity - حدث خطأ فِي أثناء استخدام الأسلوب
CodeAccessPermission.demand. - DDEerror - حدث خطأ فِي أثناء استخدام فئة نظام DDE.
- Deadlock - حدث توقف تام لقاعدة البيانات بسبب وجود حركات متعددة تنتظر كل منها الأخرى.
- DuplicateKeyException - حدث خطأ فِي الحركة التي تستخدم "تحكم التزامن المعزز بحماية التغييرات". يمكن إعادة محاولة الحركة.
- DuplicateKeyExceptionNotRecovered - حدث خطأ فِي الحركة التي تستخدم "تحكم التزامن المعزز بحماية التغييرات". لن تتم إعادة محاولة الكود، ولا يمكن الكشف عن هذا الاستثناء فِي الحركة.
- Error - حدث خطأ فادح. تم إيقاف الحركة.
- Internal - حدث خطأ داخلي فِي نظام التطوير.
- Numeric - حدث خطأ عند استخدام الوظيفة
str2intأوstr2int64أوstr2num. - UpdateConflict - حدث خطأ فِي الحركة أثناء التحديث.
- UpdateConflictNotRecovered - حدث خطأ فِي الحركة أثناء التحديث. تتعذر إعادة محاولة هذا الاستثناء.
- TransientSQLConnectionError - حدث خطأ فِي أثناء تشغيل الاستعلام. سيتم إلغاء الحركة. لن يتم اكتشاف هذا الاستثناء داخل الحركة.