\n\n\n微软 Visual Basic 应用程序 7.1;1088版
\n
我按照在线教程创建了一个自定义错误处理程序,并且已经使用它大约一年了,但我仍然不明白将vbObjectError
常量添加到 513-65535 之间的数字的部分,该部分是为用户保留的- 定义的错误。大多数教程会推荐使用Err.Raise vbOjectError + 1000
生成自定义错误的示例。这样做的原因是为了避免与错误 0-512 重叠,这些错误是为系统错误保留的。如果我必须围绕这个想法编写代码,代码将如下所示:
Option Explicit\n\nSub raiseError()\n\n On Error GoTo errorHandler\n\n Dim x As Double\n Dim y As Double\n\n Let x = 4.8\n Let y = 5.5\n\n If x <> y Then\n Err.Raise vbObjectError + 1000\n End If\n\nerrorHandler:\n\n Select Case Err.Number\n Case vbEmpty\n MsgBox "alright!"\n\n Case vbObjectError + 1000\n MsgBox ("User-defined error \'" & Err.Number & "\':" & _\n vbNewLine & _\n vbNewLine & _\n "X is not equal to Y")\n\n Case Is <> vbObjectError + 1000\n MsgBox "All other errors"\n\n End Select\n\nEnd Sub\n
Run Code Online (Sandbox Code Playgroud)\n\n现在,引用 Microsoft 的文档:
\n\n“Visual Basic 错误(Visual Basic 定义的错误和用户定义的错误)的范围为 0\xe2\x80\x9365535。范围 0\xe2\x80\x93512 保留用于系统错误;范围 513\xe2\x80 \x9365535 可用于用户定义的错误。
\n\n当在类模块中将 Number 属性设置为您自己的错误代码时,您可以将错误代码编号添加到 vbObjectError 常量中。例如,要生成错误号 513,请将 vbObjectError + 513 分配给 Number 属性。”
\n\n但令我困惑的是vbObjectError
常数的值为-2147221504
。正如您所看到的,如果运行代码,vbObjectError
和1000
或之间的任何数字之513\xe2\x80\x9365535
和都远远超出范围 513\xe2\x80\x9365535,根据 Microsoft 的说法,该范围可用于用户定义的错误。
如果我需要使用 范围内的错误号513\xe2\x80\x9365535
,为什么不直接使用这些数字,如Err.Raise 513
or Err.Raise 1000
?
我真的很感激你们的任何澄清。非常感谢大家。
\n小智 1
由于没有人回答,我将冒险进行一个(希望是有根据的)猜测。生成的“错误数字”实际上并不是 0 到 65535 (2^16-1) 之间的数字。这些数字是创建负错误代码的错误偏移量。
例如,在 Access 中,您经常会看到正错误号(如果无法连接到 DAO 工作区,则为 3146)。我不会称这些为“用户错误”,但它们超出了“系统错误”范围。
另外,如果真正的错误数不能大于 65535(最大的有符号 16 位数字),则不需要 Long 类型来保存它们。
最后,如果您曾经注意到 Microsoft 产品显示的一些错误代码,您会看到像“8xxxxxxx”这样的十六进制代码,它们是带符号十进制的大负数,就好像它们将 vbObjectError 添加到自己的内部错误号中一样。
因此,513 到 65535 之间的错误消息对于您来说非常方便,可以通过添加到 vbObjectError 来创建错误代码。我想它还可以更轻松地创建存储错误信息(错误号、描述、帮助 ID 等)的类型并创建这些类型的数组。例如,Errors(0) 将返回错误号为 513 的类型以及 ERR.Raise 语句中可能需要的其他信息。
但为什么 vbObjectError 等于-2147221504?我不知道。这不是 -(2^31) + 512。以十六进制表示,它是 FFFFFFFF80040000。我想你得向微软询问一下这个问题。
有关更多信息,请参阅另一个网站对此的想法: http://www.vbforums.com/showthread.php ?570075-vbObjectError-what-is-it-for