最大Err.Raise数?

Geo*_*rge 9 vb6 error-handling

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

根据Raise定义:Sub Raise(Number As Long, [Source], [Description], [HelpFile], [HelpContext]).该传递参数LongErr.NumberLong.

那么为什么我不能使用大于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`
Run Code Online (Sandbox Code Playgroud)

Lit*_*les 11

MSDN文档:

需要.标识错误性质的长整数.Visual Basic错误的范围是0-65535 ; 范围0-512保留用于系统错误; 范围513-65535可用于用户定义的错误.在类模块中将Number属性设置为您自己的错误代码时,您将错误代码编号添加到vbObjectError常量.例如,要生成错误号513,请将vbObjectError + 513分配给Number属性.

因此,即使您可以提交大于65535的值,任何大于65535的值都将变为错误5.


Div*_*com 9

错误5是

Run-Time Error '5': Invalid Procedure Call or Argument”
Run Code Online (Sandbox Code Playgroud)

与Justins一起回答这一点是有道理的.当您使用大于65535的整数调用它时,Raise函数会抛出错误5,因为它是一个无效的参数.

你能否展示一些代码,我可以帮助你更好一点?


Mar*_*haw 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时遇到任何问题.我们当然没有