سؤال

أريد استخدام 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() لن يتم إعدامه.

تمت الآن إعادة هيكلة معالجة الأخطاء في كتلة تعليمات برمجية واحدة

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