ما هي أفضل طريقة للتعامل مع الأخطاء في VB6
-
02-07-2019 - |
سؤال
لدي تطبيق VB6، وأريد أن أضع فيه بعض الميزات الجيدة للتعامل مع الأخطاء والتي يمكن أن تخبرني ما هو الخطأ والمكان المحدد الذي حدث فيه، هل يمكن لأي شخص أن يقترح الطريقة الجيدة للقيام بذلك
المحلول
نصائح أخرى
أولا وقبل كل شيء، اذهب للحصول على برنامج 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.