نظرة عامة حول معالجة الاستثناء المصنفة لـ 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

مثال معالجة ‏‏الاستثناء المصنفة

يظهر المثال التالي معالج الأخطاء البسيطة الآخر الذي يستخدم كشف 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)

BinaryReader

BinaryWriter

FileStream

المبادئ

مقدمة حول معالجة ‏‏الاستثناء

أنواع الأخطاء

نظرة عامة ‏‏حول معالجة الاستثناء غير المصنفة

موارد أخرى

مهام معالجة ‏الاستثناء