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 पर वापस जाएं
उपरोक्त लूप में चला जाता है, लेकिन On Error GoTo 0 को शामिल करने से,
- त्रुटि को पकड़ें
- त्रुटि हैंडलर पर जाएं
- त्रुटि हैंडलर को रद्द करें
- त्रुटि को कॉलिंग फ़ंक्शन में थ्रो करें
इससे आप अन्य प्रोग्रामिंग भाषाओं में 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