यह वास्तविक प्रश्न की तुलना में अधिक अवलोकन है: एमएस-एक्सेस (और सामान्य रूप से वीबीए) एक उपकरण खो रहा है जहां त्रुटि हैंडलिंग कोड स्वचालित रूप से जेनरेट किया जा सकता है, और जहां लाइन नंबर कर सकता है जब कोई त्रुटि होती है तो प्रदर्शित किया जाए। क्या आपको एक समाधान मिला? यह क्या है? मुझे अभी एहसास हुआ कि मैंने कितने सैकड़ों घंटे बचाए क्योंकि मुझे कुछ साल पहले इस मूल समस्या का सही जवाब मिला, और मैं देखना चाहता हूं कि इस महत्वपूर्ण मुद्दे पर आपके विचार और समाधान क्या हैं।एमएस-एक्सेस, वीबीए और एरर हैंडलिंग
उत्तर
मेरा समाधान निम्न है:
- MZ-Tools इंस्टॉल करें, वीबीए के लिए एक बहुत ही दिलचस्प ऐड-ऑन इंस्टॉल करें। नहीं, उन्होंने मुझे भुगतान नहीं किया, वैसे भी यह मुफ़्त है।
- कार्यक्रम एक मानक त्रुटि हैंडलर कोड इसी प्रकार के (देखें MZ उपकरण मेनू/विकल्प/त्रुटि हैंडलर):
On Error GoTo {PROCEDURE_NAME}_Error
{PROCEDURE_BODY}
On Error GoTo 0
Exit {PROCEDURE_TYPE}
{PROCEDURE_NAME}_Error:
debug.print "#" & Err.Number, Err.description, "l#" & erl, "{PROCEDURE_NAME}", "{MODULE_NAME}"
यह मानक त्रुटि कोड फिर स्वचालित रूप से जोड़ा जा सकता है एमजेड-टूल्स मेनू में संबंधित बटन पर क्लिक करके आपकी सभी प्रोसेस और फ़ंक्शन। आप देखेंगे कि हम यहां वीबीए (2003 संस्करण), 'एआरएल' की एक अनियंत्रित मूल्य/संपत्ति को संदर्भित करते हैं, जो 'त्रुटि रेखा' के लिए खड़ा है। आपको यह मिला! यदि आप एमजेड-टूल्स से कोड की अपनी लाइनों को स्वचालित रूप से नंबर देने के लिए कहते हैं, तो 'erl' तब आपको उस लाइन की संख्या देगा जहां त्रुटि हुई थी। तुम्हें पता है, जैसे अपने तत्काल विंडो में त्रुटि का पूरा विवरण होगा:
#91, Object variable or With block variable not set, l# 30, addNewField, Utilities
बेशक
, एक बार आप प्रणाली के हित का एहसास है, तो आप एक और अधिक परिष्कृत त्रुटि हैंडलर के बारे में सोच सकते हैं कि न केवल डीबग विंडो में डेटा को प्रदर्शित लेकिन यह भी होगा: स्क्रीन
- यह प्रदर्शन त्रुटि के विवरण के साथ एक त्रुटि लॉग फ़ाइल में एक पंक्ति सम्मिलित या
- यदि आप एक्सेस के साथ काम कर रहे हैं या यदि आप किसी डेटाबेस से कनेक्ट हैं, तो स्वचालित रूप से एक Tbl_Error तालिका में एक रिकॉर्ड जोड़ें!
का अर्थ है कि उपयोगकर्ता स्तर पर उत्पन्न प्रत्येक त्रुटि या तो मशीन या नेटवर्क पर कहीं भी फ़ाइल या टेबल में संग्रहीत की जा सकती है। क्या हम के बारे में बात कर रहे हैं स्वचालित त्रुटि रिपोर्टिंग सिस्टम वीबीए के साथ काम कर रहे हैं?
वैसे कुछ ऐसे टूल हैं जो आप MZ Tools और FMS Inc से पूछेंगे। प्रत्येक proc के शीर्ष करने के
On Error GoTo ErrorHandler
और अंत में वे एक डाल:
मूल रूप से वे एक जोड़ने शामिल एक वैश्विक त्रुटि हैंडलर जहां के लिए आम तौर पर एक कॉल के साथ
ErrorHandler:
Call MyErrorhandler Err.Number, Err.Description, Err.LineNumber
लेबल आप कस्टम त्रुटि संदेशों को प्रदर्शित और लॉग कर सकते हैं
आपने मेरे मुंह से शब्द निकाल लिए! –
यह एरर के रूप में थोड़ा भ्रामक है। लिन नम्बर मौजूद नहीं है .. इसलिए सामान्य त्रुटि प्रबंधन के लिए अच्छा अभ्यास करते समय, यह लाइन नंबरिंग के बारे में मूल समस्या के क्रूक्स का उत्तर नहीं देता है। यदि आपको ऐसा करने की आवश्यकता है तो एआरएल से जुड़े उत्तर बेहतर होंगे यदि आपके पास * लाइन नंबर होना था। – FinancialRadDeveloper
"एर्ल" का उपयोग करने के बारे में क्या, यह त्रुटि से पहले अंतिम लेबल प्रदर्शित करेगा (उदाहरण के लिए, 10, 20, या 30)?
Private Sub mySUB()
On Error GoTo Err_mySUB
10:
Dim stDocName As String
Dim stLinkCriteria As String
20:
stDocName = "MyDoc"
30:
DoCmd.openform stDocName, acFormDS, , stLinkCriteria
Exit_mySUB:
Exit Sub
Err_mySUB:
MsgBox Err.Number & ": " & Err.Description & " (" & Erl & ")"
Resume Exit_mySUB
End Sub
आप हमेशा अपना खुद का टूल जैसे Chip Pearson कर सकते हैं। वीबीए वास्तव में Microsoft Visual Basic for Applications Extensibility 5.3 Library के माध्यम से अपने स्वयं के आईडीई तक पहुंच सकता है। मैंने कुछ कक्षा मॉड्यूल लिखे हैं जो मेरे साथ काम करना आसान बनाता है। वे Code Review SE पर पाए जा सकते हैं।
मैं On Error GoTo ErrHandler
कथन और मेरे त्रुटि हैंडलिंग स्कीमा से संबंधित उपयुक्त लेबल और स्थिरांक डालने के लिए इसका उपयोग करता हूं। मैं इसे वास्तविक प्रक्रिया नामों के साथ स्थिरांक को सिंक करने के लिए भी उपयोग करता हूं (यदि फ़ंक्शन नाम बदलने के लिए होना चाहिए)।
अच्छी पोस्ट, लेकिन मैं आपके त्रुटि हैंडलर और बाहर निकलने के दिनचर्या के अभ्यास की आलोचना करता हूं, जिसमें एक समान नाम नहीं है, उदाहरण के लिए, errHandler और exitRoutine। लेबल दायरे के कारण उन्हें विशेष उप के लिए विशिष्ट बनाने का कोई कारण नहीं है। एक हेलुवा बहुत आसान काटने और पेस्टिंग बनाता है। –
आप सही हैं: त्रुटि दिनचर्या के लिए एक विशिष्ट नाम रखने की आवश्यकता नहीं है। लेकिन यह वास्तव में कोई फर्क नहीं पड़ता क्योंकि आप कॉपी/पेस्ट को 1 proc से दूसरे में नहीं बनायेंगे बल्कि "डालने त्रुटि कोड" बटन का उपयोग करेंगे, जो पूर्वनिर्धारित प्रारूप के अनुसार आवश्यक लाइनें उत्पन्न करता है। –
त्रुटि गोटो 0 पर एक अनावश्यक रेखा है, क्योंकि आप अगली पंक्ति में प्रक्रिया से बाहर निकल रहे हैं। ऑन त्रुटि गोटो त्रुटि हैंडलर कथन प्रक्रिया के बाहर लागू नहीं होता है – Nick