2010-08-30 5 views
1

Чтение различных свойств коллекции Outlook.MAPIFolder.Items приводит к ошибке, когда пользовательские разрешения недостаточны, например, если папка видна, но недоступна для просмотра.Почему существует несколько Err.Number для тех же самых опций?

Описание ошибки: У вас недостаточно прав для выполнения этой операции над этим объектом. См. Контакт с папкой или системный администратор.

Я хотел поймать эту ошибку таким образом (в 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.Number для тех же самых опций? Как бы вы могли легко ловить эти ошибки и только их? Является ли шестнадцатеричная структура числа ошибок, характерных для этой ошибки?

О, и мне не нравится идея тестирования описания (также с учетом языка и версии).

ответ

0

Этот номер ошибки выглядит как HRESULT - см. Страницу для HRESULT on Wikipedia.

Часть, которая отличается от вас, которую вы отметили как xxx, является «Facility», или, другими словами, какая часть Windows возвращает ошибку.

Фактическая ошибка находится в нижних 16 бит, или 0x00005 в вашем случае, что означает «Доступ запрещен». Значения, которые вы видите, - это разные способы, которые Windows может сказать «Доступ запрещен», например. «Доступ запрещен к файлу», «Доступ запрещен к хранилищу сертификатов», «Доступ запрещен к сетевой службе» и т. Д.

Возьмите нижние 16 бит ошибки и сравните с 5, чтобы уловить все случаи, когда msgstr "разрешений пользователя недостаточно".

+0

Очень четкое объяснение, спасибо! – raph82

0

Я считаю, что это связано с тем, что запрошенная операция является составной, то есть требует нескольких вызовов для различных COM-интерфейсов, каждый из которых может возвращать другой HRESULT, описывающий ошибку, которая произошла на этом маленьком шаге. Вложенный метод пытается сгенерировать более удобное для пользователя сообщение, поэтому в случае какой-либо ошибки он выдает ту же строку ошибок (что обычно хорошо делать, удобство использования). В то же время исходный код ошибки COM сохраняется в случае, если кто-то будет заботиться.

Я думаю, что в этом случае лучшее, что вы можете сделать, это сделать то же самое, то есть выдавать ту же удобную строку для всех кодов ошибок.

Если вы на самом деле хотите проанализировать коды ошибок, вы хотите Structure of COM Error Codes.

+0

Хороший ответ, спасибо! Когда эта ошибка произойдет, я могу спокойно и спокойно выйти из подпапки, поскольку пользователю не нужно знать. Итак, мой случай действительно «как я могу сделать разницу между тезисами ошибок и неожиданными?». RichieHindle отвечает на мои (возможно, плохо объясненные) вопросы, поэтому я выбрал его ответ на ваш. – raph82

 Смежные вопросы

  • Нет связанных вопросов^_^