نظرة عامة حول معالجة الاستثناء المصنفة لـ Visual Basic
يدعم Visual Basic معالجة استثناء مصنفة و التي يمكنك استخدامها في إنشاء و حفظ البرامج ذات معالجات الخطأ القوية و الشاملة. و تعتبر معالجة الاستثناء المصنف تعليمات برمجية مصممة للاكتشاف و الاستجابة إلى الأخطاء أثناء التنفيذ بواسطة ضم بنية عنصر التحكم (مشابهة لـ Select Case أو While) ، باستثناء كتل التعليمات البرمجية المحمية و عوامل التصفية .
و باستخدام كشف Try...Catch...Finally يمكنك حماية كتل التعليمات البرمجية التي لديها القابلية لرفع أخطاء . يمكنك تداخل معالجات الاستثناء ، و سيكون للمتغيرات التي تم تعريفها في كل كتلة نطاق محلي .
للحصول على عرض فيديو توضيحي ذي صلة، راجع كيف يمكنني القيام بما يلي: أرسل الاستثناءات غير المعالجة ببريد إلكتروني ؟ .
المحاولة... الالتقاط... الكشف الأخير
تُظهر التعليمات البرمجية التالية كشف Try...Catch...Finally .
Try
' Starts a structured exception handler.
' Place executable statements that may generate
' an exception in this block.
Catch '[optional filters]
' This code runs if the statements listed in
' the Try block fail and the filter on the Catch statement is true.
'[Additional Catch blocks]
Finally
' This code always runs immediately before
' the Try statement exits.
End Try
' Ends a structured exception handler.
كتلة Try لمعالج الاستثناء Try...Catch...Finally تحتوي على مقطع التعليمات البرمجية التي تُراقب للاستثناءات. إذا حدث خطأ أثناء تنفيذ هذا مقطع ، يفحص Visual Basic كل كشف Catch ضمن وحدة Try...Catch...Finally إلى أن يجد الذي تتطابق شروطه مع الخطأ. إذا تم العثور على واحد , ينتقل عنصر التحكم إلى أول خط من التعليمات البرمجية في كتلة Catch . في حالة عدم العثور على كشف Catch مطابق ، تستمر عملية البحث إلى كشف Catch لكتلة Try...Catch...Finally الخارجية التي تحتوي على الكتلة حيث حدث الاستثناء . و تستمر هذه العملية خلال المكدس بأكمله حتى يتم العثور على كتلة Catch مطابقة في إجراء الحالي. و إذا لم بتم العثور على أي تطابق يتم إنشاء خطأ.
التعليمات البرمجية في مقطع Finally دوماً تُنَفذ أخيراً ، فقط قبل أن تفقد كتلة معالجة الأخطاء النطاق ، بغض النظر عن ما إذا كانت التعليمات البرمجية الموجودة في كتل Catch تم تنفيذها . تنظيف مكان التعليمات البرمجية , مثل تلك المستخدمة لإغلاق الملفات و تحرير الكائنات في مقطع Finally . إذا لم تكن بحاجة إلى التقاط الاستثناءات و لكن تحتاج إلى تنظيف الموارد, خذ بعين الاعتبار استخدام كشف Using بدلاً من مقطع Finally . لمزيد من المعلومات، راجع باستخدام بيان (Visual Basic).
خطأ في التصفية في كتلة الالتقاط
كتل Catch تسمح بثلاثة خيارات لخطأ التصفية المعين. في أحدها ، تتم تصفية الأخطاء استناداً إلى الفئة الخاصة بالاستثناء (في هذه الحالة ClassLoadException) ، كما هو موضح في التعليمات البرمجية التالية.
Try
' "Try" block.
Catch e as ClassLoadException
' "Catch" block.
Finally
' "Finally" block.
End Try
إذا حدث خطأ ClassLoadException ، سيتم تنفيذ التعليمات البرمجية داخل كتلة Catch المحددة .
في خيار تصفية الخطأ الثاني, يمكن لمقطع Catch تصفية أي تعبير شرطي . الاستخدام العام واحد من هذا النوع من عامل التصفية Catch و هو اختبار أرقام الخطأ المحددة كما هو موضح في التعليمات البرمجية التالية .
Try
' "Try" block.
Catch When ErrNum = 5 'Type mismatch.
' "Catch" block.
Finally
' "Finally" block.
End Try
عندما يعثر Visual Basic على معالج خطأ مطابق ، يقوم بتنفيذ التعليمات البرمجية داخل ذلك المعالج ، ثم يمرر عنصر التحكم إلى كتلة Finally .
ملاحظة
عند محاولة العثور على كتلة Catch لمعالجة الاستثناء , يتم تقييم كل كتلة معالج حتى يتم العثور على مطابقة . حيث يمكن أن تكون هذه المعالجات استدعاءات لوظائف, قد يكون هناك تأثيرات جانبية غير متوقعة ; على سبيل المثال، مثل هذا الاستدعاء يمكنه تغيير المتغير العمومي الذي يُستخدم فيما بعد في التعليمات البرمجية لكتلة Catch المختلفة التي تنهي معالجة الاستثناء .
و كبديل ثالث ، يمكنك الجمع بين الخيارات باستخدام كل منهما لمعالجة الاستثناء . يجب نقل كشوفات Catch من الأكثر خصوصية إلى الأقل خصوصية. و ستلتقط كتلة Catch بنفسها كل الاستثناءات المشتقة من Exception، و لذلك يجب دوماً وضعها ككتلة أخيرة قبل Finally.
تتفرع خارج كتل Try…Catch
من الممكن أن تتفرع من كتل Catch عائدةً إلى كشف Try الأولي أو كشف End Try و لكن ليس من الممكن التفرع في كتلة Try…Catch المحاطة . يتم توضيح هذا هنا:
مثال معالجة الاستثناء المصنفة
يظهر المثال التالي معالج الأخطاء البسيطة الآخر الذي يستخدم كشف Try...Catch...Finally .
Option Strict On
Imports System.IO
Module Module1
Private Const FileName As String = "TestFile.data"
Public Sub Main()
' First, create a new data file and write some data to the file.
' 1. Create the new, empty data file.
If File.Exists(FileName) Then
File.Delete(FileName)
End If
Dim fs As New FileStream(FileName, FileMode.CreateNew)
' 2. Create a BinaryWriter object for the data.
Dim writer As New BinaryWriter(fs)
' 3. Write some sample data to the file.
For i = 0 To 10
writer.Write(i)
Next i
writer.Close()
fs.Close()
' Now read from the file you just made.
' 1. Create a BinaryReader object for the data stream.
fs = New FileStream(FileName, FileMode.Open, FileAccess.Read)
Dim reader As New BinaryReader(fs)
' 2. Read data from TestFile.data. The loop terminates with an
' EndOfStreamException when an attempt is made to read past
' the end of the stream.
Try
' This loop terminates with an EndOfStreamException when it
' reaches the end of the stream.
While True
Console.WriteLine(reader.ReadInt32())
End While
Console.WriteLine("The data was read with no error.")
' 3. Report the first error that is caught, if there is one.
Catch eosExcep As EndOfStreamException
' This Catch block is executed when the reader attempts
' to read past the end of the stream.
Console.WriteLine("End-of-stream exception occurred.")
Catch IOExcep As System.IO.IOException
' For this Catch block, some other error occurred before
' the end of stream was reached. Print the standard
' exception message.
Console.WriteLine(IOExcep.Message)
Finally
' The Finally block is always executed.
Console.WriteLine("Executing the Finally block.")
reader.Close()
fs.Close()
End Try
End Sub
End Module
دوماً ما تعمل كتلة Finally ، بغض النظر عن أي إجراءات تحدث في كتل Catch السابقة . لا يمكنك استخدام Resume أو Resume Next في معالجة الاستثناء المصنفة .
ملاحظة
في المثال السابق، أي استثناء غير فئة IOException أو EndOfStreamException يتم نشره إلى المستدعي غير المعالج مرة أخرى .
راجع أيضًا:
المهام
استكشاف أخطاء معالجة الاستثناء
المرجع
حاول... التقاط... أخيراً بيان (Visual Basic)
المبادئ
نظرة عامة حول معالجة الاستثناء غير المصنفة