ما هي أفضل طريقة للتعامل مع الأخطاء في VB6

StackOverflow https://stackoverflow.com/questions/116289

  •  02-07-2019
  •  | 
  •  

سؤال

لدي تطبيق VB6، وأريد أن أضع فيه بعض الميزات الجيدة للتعامل مع الأخطاء والتي يمكن أن تخبرني ما هو الخطأ والمكان المحدد الذي حدث فيه، هل يمكن لأي شخص أن يقترح الطريقة الجيدة للقيام بذلك

هل كانت مفيدة؟

المحلول

عند حدوث خطأ، انتقل إلى

و ال

Err

هدف.

هناك البرنامج التعليمي هنا.

نصائح أخرى

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

On Error GoTo {PROCEDURE_NAME}_Error

{PROCEDURE_BODY}

    On Error GoTo 0
    Exit {PROCEDURE_TYPE}

{PROCEDURE_NAME}_Error:

   LogError "Error " & Err.Number & " (" & Err.Description & ") in line " & Erl & _
            ", in procedure {PROCEDURE_NAME} of {MODULE_TYPE} {MODULE_NAME}"

ثم قم بإنشاء وظيفة LogError التي تقوم بتسجيل الخطأ على القرص.بعد ذلك، قبل إصدار التعليمات البرمجية، أضف أرقام الأسطر إلى كل وظيفة (وهذا مدمج أيضًا في MZTools).من الآن فصاعدا ستعرف من خلال سجلات الأخطاء كل ما يحدث.إذا أمكن، قم أيضًا بتحميل سجلات الأخطاء وفحصها فعليًا مباشرة من الميدان.

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

طريقة بسيطة بدون وحدات إضافية، مفيدة لوحدات الفصل الدراسي:

استباق كل وظيفة/الغواصات:

On Error Goto Handler

المعالج/الفقاعة:

Handler:
  Err.Raise Err.Number, "(function_name)->" & Err.source, Err.Description

فويلا، تتبع كومة الغيتو.

أنا استخدم محلية الصنع Error.bas وحدة لجعل إعداد التقارير وإعادة الطرح أقل تعقيدًا.

إليك محتوياته (تم تحريرها للطول):

Option Explicit

Public Sub ReportFrom(Source As Variant, Optional Procedure As String)
    If Err.Number Then
        'Backup Error Contents'
        Dim ErrNumber As Long: ErrNumber = Err.Number
        Dim ErrSource As String: ErrSource = Err.Source
        Dim ErrDescription As String: ErrDescription = Err.Description
        Dim ErrHelpFile As String: ErrHelpFile = Err.HelpFile
        Dim ErrHelpContext As Long: ErrHelpContext = Err.HelpContext
        Dim ErrLastDllError As Long: ErrLastDllError = Err.LastDllError
    On Error Resume Next
        'Retrieve Source Name'
        Dim SourceName As String
        If VarType(Source) = vbObject Then
            SourceName = TypeName(Source)
        Else
            SourceName = CStr(Source)
        End If
        If LenB(Procedure) Then
            SourceName = SourceName & "." & Procedure
        End If
        Err.Clear
        'Do your normal error reporting including logging, etc'
        MsgBox "Error " & CStr(ErrNumber) & vbLf & "Source: " & ErrSource & vbCrLf & "Procedure: " & SourceName & vbLf & "Description: " & ErrDescription & vbLf & "Last DLL Error: " & Hex$(ErrLastDllError)
        'Report failure in logging'
        If Err.Number Then
            MsgBox "Additionally, the error failed to be logged properly"
            Err.Clear
        End If
    End If
End Sub

Public Sub Reraise(Optional ByVal NewSource As String)
    If LenB(NewSource) Then
        NewSource = NewSource & " -> " & Err.Source
    Else
        NewSource = Err.Source
    End If
    Err.Raise Err.Number, NewSource, Err.Description, Err.HelpFile, Err.HelpContext
End Sub

الإبلاغ عن الخطأ أمر بسيط مثل:

Public Sub Form_Load()
On Error Goto HError
    MsgBox 1/0
    Exit Sub
HError:
    Error.ReportFrom Me, "Form_Load"
End Sub

إعادة كتابة الخطأ أمر بسيط مثل الاتصال Error.Reraise مع المصدر الجديد

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

نعم، خذ نصيحة كريس واحصل على MZTools.

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

10
    ...group of statements
20
    ...group of statements
30
    ...and so on

استخدام على

dim errhndl as string
on error goto errhndl
errhndl:
msgbox "Error"

استخدم عبارة On Error والكائن Err.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top