VBScript - त्रुटि से निपटने का उपयोग करना


84

मैं त्रुटियों को पकड़ने और उन्हें लॉग इन करने के लिए VBScript का उपयोग करना चाहता हूं (अर्थात "त्रुटि" कुछ लॉग करें ") तो स्क्रिप्ट की अगली पंक्ति को फिर से शुरू करें।

उदाहरण के लिए,

त्रुटि फिर से शुरू पर
'चरण 1 करो
'चरण 2 करो
'चरण 3 करो

जब चरण 1 पर कोई त्रुटि होती है, तो मैं चाहता हूं कि यह त्रुटि लॉग करें (या इसके साथ अन्य कस्टम फ़ंक्शन करें), फिर चरण 2 पर फिर से शुरू करें। क्या यह संभव है? और मैं इसे कैसे लागू कर सकता हूं?

संपादित करें: क्या मैं ऐसा कुछ कर सकता हूं?

त्रुटि को फिर से शुरू myErrCatch पर
'चरण 1 करो
'चरण 2 करो
'चरण 3 करो

myErrCatch:
'लॉग त्रुटि
फिर से शुरू करें

1
Dylan की प्रतिक्रिया लगभग उतनी ही अच्छी है जितनी VB को एरर हैंडलिंग डिपार्टमेंट में मिलती है। यही कारण है कि मैंने हमेशा जावास्क्रिप्ट का उपयोग किया जब मैं इसके साथ भाग सकता था।
wcm

जवाबों:


161

VBScript में अपवादों को फेंकने या पकड़ने की कोई धारणा नहीं है, लेकिन रनटाइम एक वैश्विक एर ऑब्जेक्ट प्रदान करता है जिसमें अंतिम ऑपरेशन के परिणाम शामिल हैं। आपको स्पष्ट रूप से जांचना होगा कि प्रत्येक ऑपरेशन के बाद 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

"ओन एरर गोटो [लेबल]" सिंटैक्स विजुअल बेसिक और विजुअल बेसिक फॉर एप्लीकेशन (वीबीए) द्वारा समर्थित है, लेकिन वीबीएसस्क्रिप्ट इस भाषा की सुविधा का समर्थन नहीं करता है, इसलिए आपको ऊपर वर्णित त्रुटि फिर से शुरू होने पर उपयोग करना होगा।


3
आप फ़ंक्शन या उप को कॉल करने के लिए if स्टेटमेंट के भीतर WScript.Echo को बदल सकते हैं, जो बदले में एप्लिकेशन से बाहर निकल सकता है, त्रुटि लॉग कर सकता है, आदि
StormPooper

"पिछले ऑपरेशन के पुन: प्रदर्शन में शामिल है"। क्या यह सच है? ऐसा लगता है कि यह अंतिम त्रुटि है जो एक बड़ा अंतर है।
डेमियन गोल्डिंग

एमएस के प्रलेखन सुझाव है कि बावजूद err.clearजरूरतों वस्तु के प्रत्येक जांच के बाद इस्तेमाल किया जाएगा, आगे के चेक ट्रिपिंग (जैसे, पिछले त्रुटियों को रोकने के technet.microsoft.com/en-us/library/ee692852.aspx ), मेरे अनुभव में errमंजूरी दे दी है " जैसे ही स्क्रिप्ट आगे बढ़ती है। आगे परीक्षण किए बिना, मेरा अनुमान वस्तुओं errको उनके आंतरिक संचालन के उत्पाद के रूप में उपयोग करने का है ।
user66001

@ user66001 सहमत है लेकिन अभी भी स्पष्ट रूप से कॉल करने के लिए सुरक्षित है Err.Clear
लंकिमार्ट

12

ध्यान दें कि 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

1
स्पष्ट उदाहरण नहीं जो मैंने कभी देखा है, लेकिन मुझे अवधारणा मिल गई है।
लंकिमार्ट

7
@Lankymart क्या आप उस स्पष्ट उदाहरण को जोड़ने से मन करेंगे, जो आपने तब देखा है, या इसके बजाय सुझाव देते हैं कि ओमेगास्ट्रिप कैसे इस उदाहरण को बेहतर बना सकते हैं?
डोमिनिक

3
एक सेकंड के लिए, मुझे आभास हुआ कि मुझे एक नया सॉफ्टवेयर इंजीनियरिंग प्रतिमान याद आया जिसे "ओमेगास्ट्रिप" लोल कहा जाता है
TheBlastOne

4

आप अपने कार्य फ़ंक्शन को एक मुखौटा समारोह में फिर से संगठित कर सकते हैं:

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() निष्पादित नहीं किया जाएगा।

आपकी त्रुटि से निपटने अब 1 कोड ब्लॉक में refactored है


1

मैं 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

1
यह एएसपी क्लासिक है, सादे पुराने VBScript नहीं
जोबो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.