تنفيذ معالجة الاستثناءات المنظمة
الآن بعد أن أصبح لديك فهم لطبيعة الأخطاء ومعالجة الأخطاء الأساسية في T-SQL، حان الوقت للنظر في شكل أكثر تقدما لمعالجة الأخطاء. تم تقديم معالجة الاستثناء المنظمة في SQL Server 2005.
هنا، سترى كيفية استخدامه وتقييم فوائده وقيوده، بما في ذلك كتلة TRY CATCH، ودور دوال معالجة الأخطاء، وفهم الفرق بين الأخطاء القابلة للصيد وغير القابلة للصيد. وأخيرا، سترى كيف يمكن إدارة الأخطاء وسطحها عند الضرورة.
ما المقصود ببرمجة كتلة TRY/CATCH
معالجة الاستثناء المنظم أكثر قوة من معالجة الأخطاء استنادا إلى متغير النظام @@ERROR. يسمح لك بمنع التعليمات البرمجية من أن تكون متناثرة مع التعليمات البرمجية لمعالجة الأخطاء وإضفاء الطابع المركزي على التعليمات البرمجية لمعالجة الأخطاء. تعني مركزية التعليمات البرمجية لمعالجة الأخطاء أيضا أنه يمكنك التركيز أكثر على الغرض من التعليمات البرمجية بدلا من معالجة الأخطاء التي تحتوي عليها.
كتلة TRY والكتلة CATCH
عند استخدام معالجة الاستثناءات المنظمة، يتم وضع التعليمات البرمجية التي قد تثير خطأ داخل كتلة TRY. يتم تضمين كتل TRY بواسطة عبارات BEGIN TRYوEND TRY .
في حالة حدوث خطأ قابل للالتقاط - يمكن اكتشاف معظم الأخطاء، ينتقل التحكم في التنفيذ إلى كتلة CATCH. كتلة CATCH هي سلسلة من عبارات T-SQL محاطة عبارات BEGIN CATCHوEND CATCH .
إشعار
بينما BEGIN CATCH وEND TRY عبارة منفصلة، يجب أن يتبع BEGIN CATCH فورا END TRY.
القيود الحالية
غالبا ما تقدم اللغات عالية المستوى بنية try/catch/finally، وغالبا ما تستخدم لتحرير الموارد ضمنيا. لا توجد كتلة FINALLY مكافئة في T-SQL.
فهم الفرق بين الأخطاء القابلة للصيد وغير القابلة للصيد
من المهم أن تدرك أنه في حين أن كتل TRY/CATCH تسمح لك بالقبض على نطاق أوسع بكثير من الأخطاء مما يمكنك مع @@ERROR، لا يمكنك التقاط كل نوع.
أخطاء قابلة للصيد مقابل أخطاء غير قابلة للصيد
لا يمكن اكتشاف جميع الأخطاء بواسطة كتل TRY/CATCH ضمن نفس النطاق حيث توجد كتلة TRY/CATCH. في كثير من الأحيان، يمكن اكتشاف الأخطاء التي لا يمكن اكتشافها في نفس النطاق في نطاق محيط. على سبيل المثال، قد لا تتمكن من التقاط خطأ داخل الإجراء المخزن الذي يحتوي على كتلة TRY/CATCH. ومع ذلك، من المحتمل أن تلتقط هذا الخطأ في كتلة TRY/CATCH في التعليمات البرمجية التي تسمى الإجراء المخزن حيث حدث الخطأ.
الأخطاء الشائعة غير القابلة للاقتطاع
الأمثلة الشائعة للأخطاء غير القابلة للاقتطاع هي:
- أخطاء التحويل البرمجي، مثل أخطاء بناء الجملة، التي تمنع الدفعة من التحويل البرمجي.
- مشكلات إعادة التحويل البرمجي على مستوى العبارة التي تتعلق عادة بحل الاسم المؤجل. على سبيل المثال، يمكنك إنشاء إجراء مخزن يشير إلى جدول غير معروف. يتم طرح خطأ فقط عندما يحاول الإجراء حل اسم الجدول إلى objectid.
كيفية إعادة ظهور الأخطاء باستخدام THROW
إذا تم استخدام عبارة THROW في كتلة CATCH دون أي معلمات، فإنه سيعيد ظهور الخطأ الذي تسبب في إدخال التعليمات البرمجية كتلة CATCH. يمكنك استخدام هذه التقنية لتنفيذ تسجيل الأخطاء في قاعدة البيانات عن طريق التقاط الأخطاء وتسجيل تفاصيلها، ثم طرح الخطأ الأصلي إلى تطبيق العميل، بحيث يمكن معالجته هناك.
فيما يلي مثال على كيفية إعادة ظهور خطأ.
BEGIN TRY
-- code to be executed
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE();
THROW
END CATCH
في بعض الإصدارات السابقة من SQL Server، لم يكن هناك أسلوب لطرح خطأ في النظام. بينما لا يمكن ل THROW تحديد خطأ نظام لرفعه، عند استخدام THROW دون معلمات في كتلة CATCH، فإنه سيعيد تحديد أخطاء النظام والمستخدم.
ما هي دوال معالجة الأخطاء
تجعل كتل CATCH المعلومات المتعلقة بالخطأ متاحة طوال مدة كتلة CATCH. يتضمن ذلك النطاقات الفرعية، مثل الإجراءات المخزنة، التي يتم تشغيلها من داخل كتلة CATCH.
دوال معالجة الأخطاء
يجب أن تتذكر أنه عند البرمجة باستخدام @@ERROR، تم إعادة تعيين القيمة التي يحتفظ بها متغير النظام @@ERROR بمجرد تنفيذ العبارة التالية.
ميزة رئيسية أخرى لمعالجة الاستثناء المنظم في T-SQL هي أنه تم توفير سلسلة من دوال معالجة الأخطاء والاحتفاظ بقيمها في جميع أنحاء كتلة CATCH. توفر الدالات المنفصلة كل خاصية لخطأ تم رفعه.
وهذا يعني أنه يمكنك كتابة إجراءات عامة لمعالجة الأخطاء المخزنة التي لا تزال قادرة على الوصول إلى المعلومات المتعلقة بالخطأ.
- تجعل كتل CATCH المعلومات المتعلقة بالخطأ متاحة طوال مدة كتلة CATCH.
- تتم إعادة تعيين @@Error عند تشغيل العبارة التالية.
إدارة الأخطاء في التعليمات البرمجية
يسمح تكامل SQL CLR بتنفيذ التعليمات البرمجية المدارة داخل SQL Server. لغات .NET عالية المستوى، مثل C# وVB، لديها معالجة استثناء مفصلة متاحة لها. يمكن اكتشاف الأخطاء باستخدام كتل .NET القياسية try/catch/finally.
أخطاء في التعليمات البرمجية المدارة
بشكل عام، قد ترغب في التقاط الأخطاء داخل التعليمات البرمجية المدارة قدر الإمكان. من المهم أن ندرك، على الرغم من ذلك، أن أي أخطاء لم تتم معالجتها في التعليمات البرمجية المدارة يتم تمريرها مرة أخرى إلى التعليمات البرمجية T-SQL الاستدعاء. كلما تم إرجاع أي خطأ يحدث في التعليمات البرمجية المدارة إلى SQL Server، سيظهر أنه خطأ 6522. يمكن أن تكون الأخطاء متداخلة وأن خطأ معين سيكون التفاف السبب الحقيقي للخطأ.
سبب آخر نادر ولكن محتمل للأخطاء في التعليمات البرمجية المدارة هو أن التعليمات البرمجية يمكن أن تنفذ عبارة RAISERROR T-SQL عبر كائن SqlCommand.