2012-09-21 32 views
9

爲什麼當我使用Err.Raise 65536Err.Number實際上的值是5而不是65536?最大Err.Raise數字?

根據Raise定義:Sub Raise(Number As Long, [Source], [Description], [HelpFile], [HelpContext])。通過參數是LongErr.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:

必需。標識錯誤性質的長整數。 Visual Basic錯誤的範圍是0-65535;範圍0-512被保留用於系統錯誤; 範圍513-65535可用於用戶定義的錯誤。將Number屬性設置爲類模塊中您自己的錯誤代碼時,將錯誤代碼編號添加到vbObjectError常量中。例如,要生成錯誤號513,請將vbObjectError + 513分配給Number屬性。

因此,即使你能超過65535提交值時,它說,只有值0任何大於65535將成爲5

+0

+1在您引用的幫助主題的鏈接中編輯 – MarkJ

+0

雖然文檔告訴您將vbObjectError添加到想要傳遞的錯誤值,但從技術角度來說,將該值與vbObjectError進行或運算將更正確,因爲後者是32位位域的一部分。 –

+1

@MarkBertenshaw:如果它是一個位字段,那麼ORing或添加將同樣正確。 –

9

錯誤5

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

隨着Justins回答這個問題纔有意義。當您使用65535以上的整數調用Raise函數時,會引發錯誤5,因爲它是無效參數。

你可以請出示一些代碼,我可以幫助你更好一點嗎?

+0

好趕上那裏 – Basic

+0

編輯您的請求與一些代碼。 – George

0

雖然Number被指定爲Long,在文檔中的Err.Raise錯誤-65535有效。因此,您看到的錯誤實際上是因爲您違反了Err.Raise上的限制。

爲什麼他們沒有使它成爲Integer是一個謎(可能在未來有效範圍擴大的情況下)。

+2

我的猜測是因爲VB6中的最大'整數'大小是32767. – LittleBobbyTables

+1

@LittleBobbyTables這是一個有符號的int - 無符號將是〜的兩倍 – Basic

+3

VB6沒有任何長度的無符號整數類型,除了Byte。 – Bob77

8

還有一個超出「微軟如此說」的級別。您引發的錯誤號是32位整數,因爲這是用於在組件之間傳遞錯誤的COM規範的一部分。組件的所有公共方法實際上都是返回HRESULT作爲返回值的函數;如果你有一個VB函數,它會祕密地將函數的返回值映射到[out]參數。 HRESULT值是一個由整個值堆組成的位域,但爲了簡單起見,可以將它分爲兩​​個16位部分。低16位包含實際的錯誤編號,恰好在0和65535之間 - 無符號的16位範圍。高16位有很多標準。最重要的是0x0000。所有使用這個常量的常量都以「S_」開頭(代表成功)。最常用的32位值是S_OK(0x00000000)。如果返回該值,則該功能已成功。你的大部分VB方法調用都會返回這個值。但是,任何設置了最高位的值都表示出現了錯誤。在十六進制中,這些值看起來像0x8___。有很多種類的錯誤。 VB默認返回的是0x800A。但是,COM規範只給你一個你可以正式使用的類,0x8004 - 在VB中表示爲常量vbObjectError。

事實上,VB建議您在ActiveX DLL或EXE中的公共方法上引發錯誤時使用vbObjectError常量。不管你做不做沒有區別。這只是表示由調用代碼接收的錯誤非常大且爲負數,因此您必須將您的錯誤編號與& H0000FFFF進行比較。有趣的是,它也建議你不要由於某種原因使用ActiveX控件方法。更有趣的是,VB本身在默認情況下將所有錯誤編號與0x800A0000進行比較,並且同樣檢測錯誤編號是否包含0x800A_ _ - 如果是,則爲您刪除高16位,無論如何,您只需處理與錯誤號碼本身。在我的工作場所,標準是忽略vbObjectError來利用這種行爲。

我想知道是否每個人都沒有使用vbObjectError的問題。我們當然沒有

+0

只要避免保留範圍,我不使用'vbObjectError'並且沒有問題。 –

+0

這是我一直在尋找的答案。我已經在[CodeReview.SE答案](http://codereview.stackexchange.com/a/64756/23788)的評論中將它鏈接到了可能會讓你感興趣的內容......如果你還在VB中:) –