为什么我使用Err.Raise 65536
Err.Number
实际上值为5而不是65536?
根据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`
答案 0 :(得分:11)
编号的
必需。标识错误性质的长整数。 Visual Basic错误的范围为0-65535 ;范围0-512保留用于系统错误; 范围513-65535可用于用户定义的错误。在类模块中将Number属性设置为您自己的错误代码时,您将错误代码编号添加到vbObjectError常量。例如,要生成错误号513,请将vbObjectError + 513分配给Number属性。
因此,即使您可以提交大于65535的值,任何大于65535的值都将变为错误5.
答案 1 :(得分:9)
错误5是
Run-Time Error '5': Invalid Procedure Call or Argument”
与Justins一起回答这是有道理的。当您使用大于65535的整数调用它时,Raise函数会抛出错误5,因为它是一个无效的参数。
您能否展示一些代码,我可以帮助您更好一点?
答案 2 :(得分:9)
除了“微软这么说”之外,还有一个层面。您引发的错误号是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将错误编号与AND进行对比。有趣的是,它还建议您不使用ActiveX控件方法执行此操作,出于某种原因。更有趣的是,当你默认提升它们时,VB本身会将所有错误号与0x800A0000进行对比,同样会检测错误号是否包含0x800A_ _ - 如果是,则为你删除高16位,无论如何,所以你只需处理错误号码本身。在我的工作场所,标准是忽略vbObjectError以利用这种行为。
我想知道是否有人在不使用vbObjectError时遇到任何问题。我们当然没有
答案 3 :(得分:0)
虽然Number
被指定为Long
,但在Err.Raise
的文档中,它表示只有值0-65535才有效。因此,您看到的错误实际上是因为您违反了Err.Raise
上的约束。
为什么他们没有把它变成Integer
是个谜(也许以后有效范围会扩大)。