最大Err.Raise数?

时间:2012-09-21 17:10:38

标签: vb6 error-handling

为什么我使用Err.Raise 65536 Err.Number实际上值为5而不是65536?

根据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`

4 个答案:

答案 0 :(得分:11)

来自MSDN documentation:

  

编号

     

必需。标识错误性质的长整数。 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以利用这种行为。

我想知道是否有人在不使用vb​​ObjectError时遇到任何问题。我们当然没有

答案 3 :(得分:0)

虽然Number被指定为Long,但在Err.Raise的文档中,它表示只有值0-65535才有效。因此,您看到的错误实际上是因为您违反了Err.Raise上的约束。

为什么他们没有把它变成Integer是个谜(也许以后有效范围会扩大)。