为什么同一个Err.Description有多个Err.Number?

时间:2010-08-30 16:26:14

标签: vba error-handling outlook outlook-vba

当用户权限不足时,读取Outlook.MAPIFolder.Items集合的各种属性会导致错误,例如,如果文件夹可见但不可浏览。

错误说明是:您没有足够的权限对​​此对象执行此操作。请参阅文件夹联系人或您的系统管理员。

我想以这种方式捕获该错误(在Outlook 2003中):

Sub MySub(StartFolder As Outlook.MAPIFolder)

...

On Error GoTo ErrHandler
If (StartFolder.Items.Count = 0) Then Exit Sub 'this really is a permission test'
On Error GoTo 0

...

ErrHandler:
  If ((Err.Number <> 0) And (Err.Number <> -2114519035)) Then
Call MsgBox("Error " & Err.Number & ": " & Err.Description, vbExclamation + vbOKOnly, StartFolder.Name, _
            Err.HelpFile, Err.HelpContext)
...
End Sub

测试我的错误处理程序,我发现另一个错误号具有相同的描述......并且列表迅速增长到具有相同描述的62个错误! Err.Number的范围从-2114519035到-1638395。所有错误编号看起来都是十六进制的FFxxx70005。

为什么同一个Err.Description有多个Err.Number?你如何容易地捕获这些错误,只有它们?这个错误的十六进制错误号结构是否特征?

哦,我不喜欢测试描述的想法(太过语言环境和特定版本)。

2 个答案:

答案 0 :(得分:0)

该错误编号看起来像HRESULT - 请参阅HRESULT on Wikipedia的页面。

对您而言,标记为xxx的作品是“工具”,换句话说,Windows的哪一部分正在返回错误。

实际错误位于底部16位,或者在您的情况下为0x00005,这意味着“访问被拒绝”。您看到的值是Windows可以说“访问被拒绝”的所有不同方式,例如。 “拒绝访问文件”,“拒绝访问证书存储”,“拒绝访问网络服务”等。

获取错误的最后16位并与5进行比较,以捕获“用户权限不足”的所有情况。

答案 1 :(得分:0)

我相信这是因为请求的操作是复合的,也就是说,需要多次调用各种COM接口,每个接口都可以返回一个不同的HRESULT来描述在那个小步骤发生的错误。封闭方法尝试生成更加用户友好的消息,因此如果出现任何错误,它会发出相同的错误字符串(这通常是一件好事,可用性方面)。同时,保留原始COM错误代码以防有人关心。

我认为在这种情况下,您可以做的最好的事情就是做同样的事情,即为所有错误代码提供相同的用户友好字符串。

如果您确实想要分析错误代码,则需要Structure of COM Error Codes