2012-09-21 29 views
9

यह क्यों है जब मैं Err.Raise 65536Err.Number का उपयोग वास्तव में 5 का मान और 65536 नहीं होगा?अधिकतम Err.Raise संख्या?

Raise परिभाषा के अनुसार: Sub Raise(Number As Long, [Source], [Description], [HelpFile], [HelpContext])। गुजरने वाला पैरामीटर Long और Err.Number भी Long है।

तो मैं 65535 से अधिक मूल्यों का उपयोग क्यों नहीं कर सकता?

Private Sub Command1_Click() 
Dim a As Long 
    On Error GoTo ErrCatch 
    For a = 0 To 99999 
     Err.Raise a 
     DoEvents 
    Next a 
    Exit Sub 
ErrCatch: 
    ' this is where Err.Number is evaluated 
    Resume Next 
End Sub` 
+2

यह पोकर की तरह है, आप 65536 तक बढ़ाते हैं और vb6 आपको 5 –

उत्तर

10
MSDN documentation:

संख्या

आवश्यक से

। लंबे पूर्णांक जो त्रुटि की प्रकृति की पहचान करता है। विज़ुअल बेसिक त्रुटियां 0-65535 श्रेणी में हैं; 0-512 रेंज सिस्टम त्रुटियों के लिए आरक्षित है; श्रेणी 513-65535 उपयोगकर्ता परिभाषित त्रुटियों के लिए उपलब्ध है। कक्षा मॉड्यूल में अपने स्वयं के त्रुटि कोड में संख्या गुण सेट करते समय, आप अपना त्रुटि कोड संख्या vbObjectError स्थिर में जोड़ते हैं। उदाहरण के लिए, त्रुटि संख्या 513 उत्पन्न करने के लिए, संख्या संपत्ति में vbObjectError + 513 असाइन करें।

तो भले ही आप 65535 से एक मूल्य बड़ा प्रस्तुत कर सकते हैं, कुछ भी 65535 से भी बड़ा त्रुटि 5.

+0

+1 – MarkJ

+0

उद्धृत सहायता विषय के लिंक में संपादित किया गया है, जबकि दस्तावेज़ आपको उस त्रुटि मान को vbObjectError जोड़ने के लिए कहता है, जिसे आप पास करना चाहते हैं, यह तकनीकी रूप से अधिक सटीक होगा या vbObjectError के साथ यह मान होगा, क्योंकि बाद वाला है 32-बिट बिटफील्ड का हिस्सा। –

+1

@ मार्कबर्टनशॉ: यदि यह थोड़ा सा क्षेत्र है, तो ऑरिंग या जोड़ना उतना ही सही होगा। –

9

त्रुटि 5

Run-Time Error '5': Invalid Procedure Call or Argument” 

Justins के साथ साथ का जवाब इस मतलब होता है। राइज फ़ंक्शन त्रुटि 5 फेंक रहा है जब आप इसे 65535 से अधिक पूर्णांक के साथ कहते हैं क्योंकि यह एक अवैध तर्क है।

क्या आप कुछ कोड दिखा सकते हैं और मैं आपको थोड़ा बेहतर मदद कर सकता हूं?

+0

द्वारा फिर से उठाता है अच्छा पकड़ – Basic

+0

कुछ कोड के साथ आपके अनुरोध के अनुसार संपादित किया गया। – George

0

हालांकि NumberErr.Raise के लिए दस्तावेज में, एक Long के रूप में निर्दिष्ट किया जाता है हो जाएगा यह कहते हैं कि केवल मान 0 -65535 मान्य हैं। इस प्रकार, आप जो त्रुटि देख रहे हैं वह वास्तव में है क्योंकि आप Err.Raise पर बाधाओं का उल्लंघन कर रहे हैं।

उन्होंने इसे Integer क्यों नहीं बनाया एक रहस्य है (शायद भविष्य में वैध सीमा का विस्तार होने पर)।

+2

मेरा अनुमान है क्योंकि वीबी 6 में अधिकतम 'इंटीजर' आकार 32767 है। – LittleBobbyTables

+1

@LittleBobbyTables यह एक हस्ताक्षरित int-unsigned होगा ~ – Basic

+3

वीबी 6 में बाइट को छोड़कर, किसी भी लंबाई का कोई हस्ताक्षर पूर्णांक प्रकार नहीं है। – Bob77

8

"माइक्रोसॉफ्ट ने ऐसा कहा" से आगे एक और स्तर है। आपके द्वारा उठाए गए त्रुटि संख्या 32-बिट पूर्णांक है क्योंकि यह घटकों के बीच त्रुटियों को पारित करने के लिए COM विनिर्देश का हिस्सा है। एक घटक के सभी सार्वजनिक तरीकों वास्तव में HRESULT को वापसी मूल्य के रूप में लौटने में काम कर रहे हैं; यदि आपके पास वीबी फ़ंक्शन है, तो यह गुप्त रूप से फ़ंक्शन के वापसी मान को [आउट] पैरामीटर पर मैप करता है। HRESULT मान एक बिटफील्ड है जिसमें मूल्यों का एक संपूर्ण ढेर होता है, लेकिन चीजों को सरल रखने के लिए, आप इसे दो 16-बिट भागों में विभाजित कर सकते हैं। निचले 16 बिट्स में वास्तविक त्रुटि संख्या होती है, जो 0 और 65535 के बीच होती है - हस्ताक्षरित 16 बिट रेंज। ऊपरी 16 बिट्स के लिए कई मानक हैं। सबसे महत्वपूर्ण 0x0000 है। "एस_" (सफलता के लिए खड़ा है) के साथ इस शुरुआत का उपयोग कर सभी स्थिरांक। 32 बिट मान का सबसे आम उपयोग S_OK (0x00000000) है। यदि यह मान वापस कर दिया गया है, तो फ़ंक्शन सफल हो गया है। आपकी अधिकांश वीबी विधि कॉल इस मान को वापस कर देगी। कोई भी मान जिसका शीर्ष सेट सेट है, हालांकि, इंगित करता है कि एक त्रुटि हुई है। हेक्स में, ये मान 0x8___ की तरह दिख रहे हैं। त्रुटि के कई वर्ग हैं। जो डिफ़ॉल्ट रूप से वीबी रिटर्न देता है वह 0x800A है।हालांकि, COM विनिर्देश केवल आपको एक वर्ग देता है जिसे आप आधिकारिक तौर पर 0x8004 का उपयोग कर सकते हैं - जिसे VB में निरंतर vbObjectError के रूप में दर्शाया जाता है।

वास्तव में, वीबी आपको ActiveX DLLs या EXEs में सार्वजनिक विधियों पर त्रुटियों को उठाते समय vbObjectError निरंतर उपयोग करने की अनुशंसा करता है। चाहे आप कोई फर्क नहीं पड़ता या नहीं। इसका मतलब यह है कि कॉलिंग कोड द्वारा प्राप्त त्रुटि बहुत बड़ी और नकारात्मक है, इसलिए आपको & H0000FFFF के साथ और आपकी त्रुटि संख्या है। दिलचस्प बात यह है कि यह भी सिफारिश करता है कि किसी कारण से ActiveX नियंत्रण विधियों के साथ ऐसा न करें। और भी दिलचस्प बात यह है कि वीबी स्वयं 0x800A0000 के साथ सभी त्रुटि संख्याओं को डिफ़ॉल्ट रूप से बढ़ाते समय, और इसी प्रकार यह पता लगाता है कि त्रुटि संख्या में 0x800A_ _ है - और यदि ऐसा है, तो आपके लिए ऊपरी 16 बिट्स को हटा दें, फिर भी आप सौदा करते हैं त्रुटि संख्या के साथ ही। मेरे कार्यस्थल पर, मानक इस व्यवहार का लाभ उठाने के लिए vbObjectError को अनदेखा करना है।

मुझे आश्चर्य है कि किसी को भी vbObjectError का उपयोग न करने में समस्याएं हैं। हम निश्चित रूप से

+0

मैं 'vbObjectError' का उपयोग नहीं करता हूं और जब तक मैं आरक्षित सीमा से बचता हूं तब तक कोई समस्या नहीं होती है। –

+0

यह वह उत्तर है जिसे मैं सभी के साथ ढूंढ रहा हूं। मैंने इसे [CodeReview.SE उत्तर] (http://codereview.stackexchange.com/a/64756/23788) पर एक टिप्पणी में लिंक किया है जो आपको रूचि दे सकता है ... यदि आप अभी भी वीबी में हैं :) –