عبارة Visual Basic) Try...Catch...Finally)
توفر طريقة لمعالجة بعض أو كل الأخطاء المحتملة التي قد تحدث في مقطع محدد من التعليمات البرمجية، أثناء تشغيل التعليمات البرمجية.
Try
[ tryStatements ]
[ Exit Try ]
[ Catch [ exception [ As type ] ] [ When expression ]
[ catchStatements ]
[ Exit Try ] ]
[ Catch ... ]
[ Finally
[ finallyStatements ] ]
End Try
الأجزاء
tryStatements
اختياري. عبارات حيث يمكن للخطأ أن يحدث. يمكن أن تكون عبارة مركبة.Catch
اختياري. يسمح لمقاطع Catch متعددة. في حالة حدوث استثناء أثناء معالجة مقطع Try، كل عبارة Catch يتم فحصها بترتيب نصي لتحديد ما إذا كانت تعالج الاستثناء، مع exception الذي يمثل الاستثناء الذي تم طرح.exception
اختياري. أي اسم متغير. قيمة exception الأولية هي قيمة الخطأ المطروح. تستخدم مع Catch لتحديد خطأ الذي تم التقاطه. إذا أهمل، العبارة Catch تلتقط أي استثناء.type
اختياري. تحدد نوع فلتر الفئة. إذا كانت قيمة exception من النوع المحدد من قبل type أو من نوع مشتق، يصبح المعرف ملزما لكائن الاستثناء.When
اختياري. عبارة Catch مع بند When تلتقط استثناءات فقط حين expression تقيم إلى True. بند When يتم تطبيقه فقط بعد التحقق من نوع الاستثناء, و expression قد يشير إلى معرّف يمثل الاستثناء.expression
اختياري. يجب أن تكون قابلة للتحويل إلى ضمناً إلى Boolean. أي تعبير يصف عامل تصفية عام. يستخدم عادة للتصفية حسب رقم الخطأ. يستخدم مع الكلمة الأساسية When لتحديد الظروف التي تحتها تم التقاط الخطأ.catchStatements
اختياري. عبارات لمعالجة الأخطاء التي تحدث في المقطع Try المقترن. يمكن أن تكون عبارة مركبة.Exit Try
اختياري. كلمة أساسية تخرج من بنية Try...Catch...Finally. يستأنف التنفيذ مع التعليمات البرمجية التي تلي مباشرة العبارة End Try. العبارة Finally سيتم تنفيذها. غير مسموح بها في مقاطع Finally.Finally
اختياري. مقطع Finally دوماً يتم تنفيذه عندما يترك التنفيذ أي جزء من العبارة Try.finallyStatements
اختياري. عبارات يتم تنفيذها بعد ظهور كل معالجات الأخطاء الأخرى.End Try
تنهي بنية Try...Catch...Finally.
ملاحظات
إذا كنت تتوقع أن استثناء معين قد يحدث أثناء مقطع محدد من التعليمات البرمجية, ضع التعليمات البرمجية في مقطع Try واستخدام مقطع Catch للحفاظ على التحكم و معالجة الاستثناء إذا حدث. يمكنك استخدام العديد من مقاطع Catch المختلفة حسب الضرورة داخل بنية Try.
المتغيرات المحلية من مقطع Try لا تتوفر في مقطع Catch لأنها مقاطع منفصلة. إذا كنت تريد استخدام متغير في أكثر من مقطع، عرف المتغير خارج البنية Try...Catch...Finally.
المقطع Try يحتوي على تعليمات برمجية يمكن أن يحدث بها خطأ, و المقطع Catch يحتوي على تعليمات برمجية لمعالجة أية أخطاء هل تحدث. إذا حدث خطأ في مقطع Try يتم تمرير عنصر تحكم البرنامج إلى عبارة Catch مناسبة للتصرف فيه. الوسيطة exception هي مثيل للفئة Exception أو فئة مشتقة من فئة Exception. مثيل الفئة Exception يناظر الخطأ الذي حدث في المقطع Try. يحتوي المثيل على معلومات حول خطأ. يتضمن هذا, بين أشياء أخرى رقمه و رسالة.
إذا كانت عبارة Catch لا تحدد وسيطة exception، فإنها تلتقط أي نوع من استثناء النظام أو التطبيق. يجب دوماً استخدام التنوع كمقطع Catch أخير في بنية Try...Catch...Finally، بعد التقاط كل الاستثناءات المحددة كما توقعت. تدفق عناصر التحكم لايمكنه أبداً الوصول إلى مقطع Catch الذي يتبع Catch بدون وسيطة exception.
إذا كان لديك عبارة أو أكثر يجب أن تنفذ قبل الإنتهاء من البنية Try, استخدم مقطع Finally. يمرر التحكم إلى مقطع Finally قبل الخروج من بنية Try. يكون هذا صحيحاً حتى في حالة حدوث استثناء في أي مكان داخل بنية Try.
لا يمرر عنصر التحكم من مقطع Try أو Catch إلى المقطع Finally المطابق في الحالات التالية:
يصادف إنهاء الكشف داخل مقطع Try أو Catch.
يطرح StackOverflowException داخل مقطع Try أو Catch.
في حالات الثقة الجزئية، مثل تطبيق تتم استضافته على شبكة اتصال مشتركة Try...Catch...Finally لا يلتقط استثناءات الأمان التي تحدث قبل استدعاء الأسلوب الذي يحتوي الاستدعاء. المثال التالي، عند وضعه على خادم مشترك وتشغيله من هناك، ينتج الخطأ "System.Security.SecurityException: فشل الطلب." لمزيد من المعلومات حول استثناءات الأمان، راجع الفئة SecurityException.
Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button1.Click
Try
Process.Start("https://www.microsoft.com")
Catch ex As Exception
MsgBox("Can't load Web page" & vbCrLf & ex.Message)
End Try
End Sub
في مثل حالة الثقة الجزئية، يجب عليك وضع العبارة Process.Start في Sub منفصل. الاستدعاء الأولي إلى Sub سيفشل. هذا يمكّن Try...Catch من التقاطه قبل Sub الذي يحتوي Process.Start الذي يتم تشغيله و يتم انتاج استثناء أمان.
ملاحظة
إذا كانت عبارة Try لا تحتوي مقطع Catch واحد على الأقل, يجب أن تحتوي على مقطع Finally.
مثال
يوضح المثال المبسط التالي بنية العبارة Try...Catch...Finally.
Public Sub TryExample()
Dim x As Integer = 5 ' Declare variables.
Dim y As Integer = 0
Try ' Set up structured error handling.
x = x \ y ' Cause a "Divide by Zero" error.
Catch ex As Exception When y = 0 ' Catch the error.
Beep()
MsgBox("You tried to divide by 0.") ' Show an explanatory message.
Finally
Beep() ' This line is executed no matter what.
End Try
End Sub