عبارة Visual Basic) On Error)

تمكن روتين معالجة الخطأ و تعين موقع الروتين داخل إجراء; يمكن استخدامها أيضاً لتعطيل روتين معالجة الخطأ.

بدون العبارة On Error أي خطأ يحدث في وقت التشغيل يكون فادح: رسالة خطأ تظهر، و يتوقف التنفيذ.

كلما أمكن، نقترح استخدام ‏‏ معالجة استثناء منظمة في التعليمات البرمجية الخاصة بك, بدلا من اللجوء إلى معالجة ‏‏استثناء غير منظمة و عبارة On Error. لمزيد من المعلومات، راجع استثناء مصنفة المعالجة في Visual Basic.

ملاحظة

الكلمة الأساسية Error يتم أيضاً استخدامها في كشف خطأ، الذي يعتمد للتوافق الخلفي.

On Error { GoTo [ line | 0 | -1 ] | Resume Next }

الأجزاء

  • GoToline
    يمكّن روتين معالجة الأخطاء الذي يبدأ عند السطر المحدد في الوسيطة line المطلوبة. الوسيطة line هي وسيطة أي تسمية سطر أو رقم السطر. في حالة حدوث خطأ في وقت التشغيل، تحكم بالفروع للسطر المحدد، لتنشيط معالج الأخطاء. يجب أن يكون السطر المحدد في نفس الإجراء كعبارة On Error, أو سيحدث خطأ في وقت التحويل البرمجي.

  • GoTo 0
    يعطل معالج الخطأ الذي تم تمكينه في الإجراء الحالي ويعيد تعيينه إلى Nothing.

  • GoTo -1
    يعطل الاستثناء الذي تم تمكينه في الإجراء الحالي ويعيد تعيينه إلى Nothing.

  • Resume Next
    يحدد أن عند حدوث خطأ في وقت التشغيل، ينتقل عنصر التحكم إلى العبارة التي تلي العبارة التي حدث عندها الخطأ مباشرة، و متابعة التنفيذ من تلك النقطة. استخدم هذا النموذج بدلاً من On Error GoTo عند الوصول إلى الكائنات.

ملاحظات

معالج الخطأ "الممكّن" هو الذي يتم تشغيله بواسطة العبارة On Error. معالج الخطأ "النشيط" هو معالج ممكّن يقوم بعملية معالجة خطأ.

إذا حدث خطأ و كان معالج الأخطاء نشيط (بين حدوث الخطأ و عبارة Resume, Exit Sub, Exit Function، أو Exit Property) ، معالج الخطأ في الإجراء الحالي لا يمكنه معالجة الخطأ. يتم إرجاع عنصر التحكم إلى إجراء الاستدعاء.

إذا كان لإجراء الاستدعاء معالج خطأ ممكن, يتم تنشيطه لمعالجة الخطأ. إذا كان معالج الخطأ لإجراء الاستدعاء نشطاً أيضاً, يتم تمرير التحكم مرة أخرى خلال إجراءات استدعاء سابقة حتى يتم العثور على معالج خطأ ممكن، ولكن غير نشط. إذا لم يتم العثور على مثل معالج الخطأ ذاك, يكون الخطأ فادح عند النقطة التي حدث بها فعلا.

كل مرة يقوم بها معالج الخطأ بتمرير التحكم إلى إجراء استدعاء، ذلك الإجراء يصبح الإجراء الحالي. حالما تتم معالجة خطأ عن طريق معالج خطأ في أي إجراء، يستأنف التنفيذ في الإجراء الحالي عند النقطة المعينة بالعبارة Resume.

ملاحظة

روتين معالج الخطأ ليس إجراء Sub أو إجراء Function. وهو مقطع من التعليمات البرمجية وضعت له علامة باستخدام تسمية سطر أو رقم سطر.

خاصية الرقم

يعتمد روتين معالج الخطأ على القيمة في خاصية Number للكائن Err لتحديد سبب الخطأ. يجب على الروتين اختبار أو حفظ قيم الخاصية ذات الصلة في الكائن Err قبل حدوث أي خطأ أو قبل استدعاء إجراء قد يتسبب في حدوث خطأ. قيم الخاصية في الكائن Err تعكس فقط الخطأ الأكثر حداثة. رسالة الخطأ المقترنة بـErr.Number موجودة في Err.Description.

عبارة الطرح

الخطأ الذي تم رفعه بواسطة الأسلوب Err.Raise يعين الخاصية Exception إلى مثيل تم إنشاؤه حديثاً لفئة Exception. من أجل دعم رفع الاستثناءات من أنواع استثناء مشتق، يتم اعتماد عبارة Throw في اللغة. يأخذ هذا معلمة واحدة التي هي مثيل ‏الاستثناء الذي سيتم طرحه. يظهر المثال التالي كيفية استخدام هذه الميزات مع دعم معالجة الاستثناء الموجودة:

    On Error GoTo Handler
    Throw New DivideByZeroException()
Handler:
    If (TypeOf Err.GetException() Is DivideByZeroException) Then
    ' Code for handling the error is entered here.
    End If

لاحظ أن العبارة On Error GoTo تحصر كل الأخطاء، بغض النظر عن فئة‏‏ الاستثناء.

On Error Resume Next

On Error Resume Next يؤدي إلى استمرار التنفيذ مع العبارة التي تلي مباشرة العبارة التي سببت خطأ وقت التشغيل، أو مع العبارة التي تلي مباشرة أحدث استدعاء للإجراء الذي يحتوي على العبارة On Error Resume Next. هذه العبارة تسمح بمتابعة التنفيذ رغم خطأ وقت التشغيل. يمكنك وضع روتين معالجة الخطأ بموقع قد يحدث به خطأ بدلاً من نقل عنصر تحكم إلى موقع آخر ضمن الإجراء. عبارة On Error Resume Next تصبح غير نشطه عند استدعاء إجراء آخر، لذا يجب تنفيذ عبارة On Error Resume Next في كل روتين يتم استدعائه إذا كنت تريد معالجة أخطاء مضمنة في ذلك الروتين.

ملاحظة

بناء On Error Resume Next قد يكون الأفضل إلى On Error GoTo عندما يتم إنشاء معالجة أخطاء أثناء الوصول إلى البعض الكائنات. التحقق من Err بعدما يزيل كل تفاعل مع كائن الغموض حول أي كائن تم الوصول إليه من قبل التعليمات البرمجية. يمكنك التأكد أي من الكائنات هو من وضع رمز الخطأ في Err.Number، بالإضافة إلى أي من الكائنات هو الذي أنشأ الخطأ (الكائن المحدد في Err.Source).

تشغيل الانتقال إلى الخطأ 0

On Error GoTo 0 تعطل معالجة الخطأ في الإجراء الحالي. لا تحدد سطر 0 كبداية التعليمات البرمجية لمعالجة الأخطاء, حتى إذا كان الإجراء يحتوي على سطر مرقم من 0. بدون العبارة On Error GoTo 0 يتم تعطيل معالج الخطأ تلقائياً عند إنهاء الإجراء.

تشغيل الانتقال إلى الخطأ 1-

On Error GoTo -1 تعطل الاستثناء في الإجراء الحالي. لا تحدد سطر -1 كبداية التعليمات البرمجية لمعالجة الأخطاء, حتى إذا كان الإجراء يحتوي على سطر مرقم من -1. بدون العبارة On Error GoTo -1 يتم تعطيل الاستثناء تلقائياً عند إنهاء الإجراء.

لمنع التعليمات البرمجية لمعالجة الأخطاء من العمل عندما لا يكون هنالك خطأ قد حدث, ضع العبارة Exit Sub, Exit Function، أو Exit Property مباشرة قبل روتين معالجة الأخطاء, كما هو موضح في الجزء التالي:

Public Sub InitializeMatrix(ByVal Var1 As Object, ByVal Var2 As Object)
   On Error GoTo ErrorHandler
   ' Insert code that might generate an error here
   Exit Sub
ErrorHandler:
   ' Insert code to handle the error here
   Resume Next
End Sub

هنا، تتبع التعليمات البرمجية لمعالجة الأخطاء العبارة Exit Sub و تسبق العبارة End Sub لفصله عن تدفق الإجراء. يمكنك وضع التعليمات البرمجية لمعالجة الأخطاء في أي مكان في إجراء.

أخطاء غير محاصرة

يتم إرجاع الأخطاء غير المحاصرة في الكائنات إلى تطبيق التحكم عندما يكون الكائن قيد التشغيل كملف تنفيذي. يتم إرجاع الأخطاء غير المحاصرة داخل بيئة التطوير إلى تطبيق التحكم فقط إذا تم تعيين الخيارات المناسبة. راجع وثائق تطبيق المضيف الخاص بك للحصول على وصف الخيارات التي ينبغي أن تحدد أثناء التصحيح، كيفية تعيينها، و إن كان المضيف يمكنه إنشاء فئات.

إذا قمت بإنشاء كائن يمكنه الوصول إلى كائنات أخرى، يجب أن تحاول معالجة أي أخطاء لم يتم معالجتها يتم تمريرها. إذا لم يمكنك ذلك، عين رموز الخطأ في Err.Number لأحد الأخطاء الخاصة بك ثم قم بتمريرها مرة أخرى إلى المستدعي للكائن الخاص بك. يجب تحديد الخطأ الخاصة بك عن طريق إضافة رمز الخطأ الخاص بك إلى الثابت VbObjectError. على سبيل المثال، إذا كان رمز الخطأ 1052 ، قم بتعيينه كما يلي:

Err.Number = vbObjectError + 1052
ملاحظة تنبيهتنبيه

أخطاء النظام أثناء استدعاءات إلى مكتبات الارتباط الحيوي (DLL) في Windows لا ترفع استثناءات ولا يمكن حصرها مع تراكب خطأ Visual Basic. عند استدعاء دوال (DLL) ، عليك التحقق من نجاح أو فشل كل قيمة مرجعة (استناداً إلى مواصفات API) ، وفي حال الفشل, تحقق من القيمة الموجودة في خاصية LastDLLError للكائن Err.

مثال

هذا المثال يستخدم أولا العبارة On Error GoTo لتعيين موقع روتين معالجة الأخطاء داخل إجراء. في المثال، محاولة القسمة على الصفر تنشئ خطأ رقم 6. يتم معالجة الخطأ في روتين معالجة الخطأ، و يتم إرجاع عنصر التحكم إلى العبارة المسببة للخطأ. العبارة On Error GoTo 0 توقف تشغيل تراكب الخطأ. ثم تستخدم العبارة On Error Resume Next لتأجيل تراكب الخطأ بحيث سياق الخطأ الذي تم إنشاؤه بواسطة العبارة التالية يمكن أن يعرف بكل تأكيد. لاحظ أن Err.Clear يتم استخدامه لمسح خصائص الكائن Err بعد معالجة الخطأ.

Public Sub OnErrorDemo()
   On Error GoTo ErrorHandler   ' Enable error-handling routine.
   Dim x As Integer = 32
   Dim y As Integer = 0
   Dim z As Integer
   z = x / y   ' Creates a divide by zero error
   On Error GoTo 0   ' Turn off error trapping.
   On Error Resume Next   ' Defer error trapping.
   z = x / y   ' Creates a divide by zero error again
   If Err.Number = 6 Then
      ' Tell user what happened. Then clear the Err object.
      Dim Msg As String
      Msg = "There was an error attempting to divide by zero!"
      MsgBox(Msg, , "Divide by zero error")
      Err.Clear() ' Clear Err object fields.
   End If
Exit Sub      ' Exit to avoid handler.
ErrorHandler:  ' Error-handling routine.
   Select Case Err.Number   ' Evaluate error number.
      Case 6   ' Divide by zero error
         MsgBox("You attempted to divide by zero!")
         ' Insert code to handle this error
      Case Else
         ' Insert code to handle other situations here...
   End Select
   Resume Next  ' Resume execution at same line
                ' that caused the error.
End Sub

المتطلبات

مساحة الاسم: Microsoft.VisualBasic

**التجميع:**مكتبة Visual Basic لوقت تشغيل (في Microsoft.VisualBasic.dll)

راجع أيضًا:

المرجع

إنهاء الكشف

Err

عبارة الخروج Vsual Basic) )

LastDllError

عبارة Resume

المبادئ

رسائل الخطأ (Visual Basic)