VBA में Try-Catch-Finally का कार्यान्वयन

आम तौर पर त्रुटि हैंडलिंग प्रत्येक फ़ंक्शन में न्यूनतम रूप से की जाती है, और फिर इसे कॉलिंग फ़ंक्शन में थ्रो किया जाता है, लेकिन VBA में इसे आसानी से लागू नहीं किया जा सकता है।

जब आप एक त्रुटि हैंडलर बनाते हैं, तो यह त्रुटि को निगल जाता है, और जब आप Err.Raise को फिर से कॉल करने का प्रयास करते हैं, तो यह फ़ंक्शन के भीतर त्रुटि को पकड़ लेता है और एक अनंत लूप में चला जाता है।

एक विशिष्ट उदाहरण के रूप में,

  • Open फ़ंक्शन के बाद फ़ाइल खोलने पर त्रुटि होने पर भी Close को निष्पादित करना चाहते हैं।
  • इसके अलावा, त्रुटि को कॉलिंग फ़ंक्शन में पास करना चाहते हैं।
On Error GoTo 0
Call Err.Raise(Err.Number)

समाधान के लिए उपरोक्त कोड का उपयोग करें। व्याख्या और उदाहरण नीचे दिए गए हैं।

On Error GoTo 0

On Error GoTo 0 का उपयोग करने से, आप पहले परिभाषित किए गए On Error को रद्द कर सकते हैं।

आमतौर पर, जब आप त्रुटि हैंडलर में Err.Raise लिखते हैं,

  1. त्रुटि को पकड़ें
  2. त्रुटि हैंडलर पर जाएं
  3. त्रुटि को थ्रो करें
  4. 1 पर वापस जाएं

उपरोक्त लूप में चला जाता है, लेकिन On Error GoTo 0 को शामिल करने से,

  1. त्रुटि को पकड़ें
  2. त्रुटि हैंडलर पर जाएं
  3. त्रुटि हैंडलर को रद्द करें
  4. त्रुटि को कॉलिंग फ़ंक्शन में थ्रो करें

इससे आप अन्य प्रोग्रामिंग भाषाओं में Try-Catch-Finally की तरह कार्यान्वयन कर सकते हैं।

कोड उदाहरण

केवल त्रुटि हैंडलिंग → थ्रो की आवश्यकता हो

Public sub Caller()
    On Error GoTo ERROR_HANDLER
    Call Called

ERROR_HANDLER:
    Debug.Print(Err.Number)
End Sub
Public sub Called()

    On Error GoTo ERROR_HANDLER
    Dim errNumber as Long

    ' त्रुटि उत्पन्न करने वाली प्रक्रिया लिखें

    Exit Sub

ERROR_HANDLER:
    errNumber = Err.Number
    On Error GoTo 0

    ' यहाँ त्रुटि के बाद की प्रक्रिया लिखें

    ' त्रुटि को कॉलिंग फ़ंक्शन में पास करें
    Call Err.Raise(errNumber)

End Sub

Try-Catch-Finally का कार्यान्वयन

यह काफी लंबा कोड है।

Public sub Caller()

    On Error GoTo ERROR_HANDLER

    Call Called

ERROR_HANDLER:
    Debug.Print(Err.Number)
End Sub

Public sub Called()

    On Error GoTo ERROR_HANDLER
    Dim errNumber as Long

    ' त्रुटि उत्पन्न करने वाली प्रक्रिया लिखें

FINALLY:

    If errNumber <> 0 then
        Err.Raise(errNumber)
    End if

    Exit Sub
ERROR_HANDLER:
    errNumber = Err.Number
    On Error GoTo 0

    ' यहाँ त्रुटि के बाद की प्रक्रिया लिखें

     Resume FINALLY
End Sub

वास्तविक उदाहरण

केवल Try-Catch का उपयोग

'------------------------------------------------
'
' फ़ंक्शन को कॉल करने वाला फ़ंक्शन
'
'------------------------------------------------
Public Sub Caller()
    On Error GoTo ERROR_HANDLER
    Call Called

ERROR_HANDLER:

    Debug.Print "कॉलिंग फ़ंक्शन : Catch"

End Sub
'------------------------------------------------
'
' कॉल किया गया (थ्रो करने वाला) फ़ंक्शन
'
'------------------------------------------------
Public Sub Called()

    On Error GoTo ERROR_HANDLER
    Dim errNumber as Long

    Dim n As Long: n = 1 / 0

    Exit Sub

ERROR_HANDLER:
    errNumber = Err.Number
    On Error GoTo 0

    Debug.Print "कॉल किया गया फ़ंक्शन : Catch"

    ' त्रुटि को कॉलिंग फ़ंक्शन में पास करें
    Call Err.Raise(errNumber)

End Sub

निष्पादन परिणाम

कॉल किया गया फ़ंक्शन : Catch
कॉलिंग फ़ंक्शन : Catch

Try-Catch-Finally का कार्यान्वयन

'------------------------------------------------
'
' फ़ंक्शन को कॉल करने वाला फ़ंक्शन
'
'------------------------------------------------
Public sub Caller()

    On Error GoTo ERROR_HANDLER

    Call Called

ERROR_HANDLER:

    Debug.Print "कॉलिंग फ़ंक्शन : Catch"

End Sub

'------------------------------------------------
'
' कॉल किया गया (थ्रो करने वाला) फ़ंक्शन
'
'------------------------------------------------
Public sub Called()

    On Error GoTo ERROR_HANDLER

    Dim errNumber as long

    Dim n as long: n = 1 / 0

FINALLY:

    Debug.Print "कॉल किया गया फ़ंक्शन : Finally"

    If errNumber <> 0 then
        Err.Raise(errNumber)
    End if

    Exit Sub
ERROR_HANDLER:
    errNumber = Err.Number
    On Error GoTo 0

    Debug.Print "कॉल किया गया फ़ंक्शन : Catch"

     Resume FINALLY
End Sub

निष्पादन परिणाम

कॉल किया गया फ़ंक्शन : Catch
कॉल किया गया फ़ंक्शन : Finally
कॉलिंग फ़ंक्शन : Catch
#Excel #VBA