VBScript - استخدام معالجة الأخطاء
-
03-07-2019 - |
سؤال
أريد استخدام VBScript لاكتشاف الأخطاء وتسجيلها (أي عند حدوث خطأ "تسجيل شيء ما") ثم استئناف السطر التالي من البرنامج النصي.
على سبيل المثال،
On Error Resume Next 'Do Step 1 'Do Step 2 'Do Step 3
عند حدوث خطأ في الخطوة 1، أريد منه تسجيل هذا الخطأ (أو تنفيذ وظائف مخصصة أخرى به) ثم استئنافه في الخطوة 2.هل هذا ممكن؟وكيف يمكنني تنفيذه؟
يحرر:هل يمكنني أن أفعل شيئًا كهذا؟
On Error Resume myErrCatch 'Do step 1 'Do step 2 'Do step 3 myErrCatch: 'log error Resume Next
المحلول
وفبسكريبت ليس لديه فكرة رمي أو اصطياد الاستثناءات، لكن يوفر وقت التشغيل كائن خطأ العالمي الذي يحتوي على نتائج العملية الأخيرة التي يؤدونها. لديك للتحقق بشكل واضح ما إذا كانت الخاصية Err.Number هي غير صفرية بعد كل عملية.
On Error Resume Next
DoStep1
If Err.Number <> 0 Then
WScript.Echo "Error in DoStep1: " & Err.Description
Err.Clear
End If
DoStep2
If Err.Number <> 0 Then
WScript.Echo "Error in DoStop2:" & Err.Description
Err.Clear
End If
'If you no longer want to continue following an error after that block's completed,
'call this.
On Error Goto 0
وو"على خطأ انتقل الى [التسمية]" ويدعم تركيب بواسطة Visual Basic و Visual Basic للتطبيقات (VBA)، ولكن فبسكريبت لا تدعم هذه الميزة اللغة بحيث يكون لديك لاستخدام على خطأ استئناف التالي كما هو موضح أعلاه.
نصائح أخرى
ملاحظة لا يتم تعيين هذا On Error Resume Next
عالميا. يمكنك وضع جزء غير آمن بك من التعليمات البرمجية على سبيل المثال في وظيفة، والتي سوف توقف على الفور إذا حدث خطأ، واستدعاء هذه الدالة من الباطن التي تحتوي على بيان سابقة OERN
.
ErrCatch()
Sub ErrCatch()
Dim Res, CurrentStep
On Error Resume Next
Res = UnSafeCode(20, CurrentStep)
MsgBox "ErrStep " & CurrentStep & vbCrLf & Err.Description
End Sub
Function UnSafeCode(Arg, ErrStep)
ErrStep = 1
UnSafeCode = 1 / (Arg - 10)
ErrStep = 2
UnSafeCode = 1 / (Arg - 20)
ErrStep = 3
UnSafeCode = 1 / (Arg - 30)
ErrStep = 0
End Function
وأنا جديدة بشكل استثنائي إلى VBScript، لذلك هذا لا يجوز النظر في أفضل الممارسات أو قد يكون هناك سبب لا ينبغي أن يتم ذلك بهذه الطريقة وأنا لست على علم حتى الآن، ولكن هذا هو الحل خطرت لي مع لخفض عدد وكمية من التعليمات البرمجية تسجيل الخطأ في كتلة التعليمات البرمجية الرئيسي بلدي.
Dim oConn, connStr
Set oConn = Server.CreateObject("ADODB.Connection")
connStr = "Provider=SQLOLEDB;Server=XX;UID=XX;PWD=XX;Databse=XX"
ON ERROR RESUME NEXT
oConn.Open connStr
If err.Number <> 0 Then : showError() : End If
Sub ShowError()
'You could write the error details to the console...
errDetail = "<script>" & _
"console.log('Description: " & err.Description & "');" & _
"console.log('Error number: " & err.Number & "');" & _
"console.log('Error source: " & err.Source & "');" & _
"</script>"
Response.Write(errDetail)
'...you could display the error info directly in the page...
Response.Write("Error Description: " & err.Description)
Response.Write("Error Source: " & err.Source)
Response.Write("Error Number: " & err.Number)
'...or you could execute additional code when an error is thrown...
'Insert error handling code here
err.clear
End Sub
يمكنك إعادة تجميع استدعاءات وظائف الخطوات الخاصة بك في وظيفة الواجهة:
sub facade()
call step1()
call step2()
call step3()
call step4()
call step5()
end sub
بعد ذلك، دع معالجة الأخطاء تكون في وظيفة عليا تستدعي الواجهة :
sub main()
On error resume next
call facade()
If Err.Number <> 0 Then
' MsgBox or whatever. You may want to display or log your error there
msgbox Err.Description
Err.Clear
End If
On Error Goto 0
end sub
الآن، لنفترض step3()
يثير خطأ.منذ facade()
لا يتعامل مع الأخطاء (يوجد لا On error resume next
في facade()
)، سيتم إرجاع الخطأ إلى main()
و step4()
و step5()
لن يتم إعدامه.
تمت الآن إعادة هيكلة معالجة الأخطاء في كتلة تعليمات برمجية واحدة