Почему существует несколько Err.Number для одного и того же Err.Description? - PullRequest
1 голос
/ 30 августа 2010

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

О, и мне не нравится идея тестирования описания (слишком специфичного для локали и версии).

Ответы [ 2 ]

0 голосов
/ 30 августа 2010

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

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

Если вы действительно хотите проанализировать коды ошибок, вам нужно Структура кодов ошибок COM .

0 голосов
/ 30 августа 2010

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

Кусок, который вам подходит, который вы пометили как xxx, «Средство», или, другими словами, какая часть Windows возвращает ошибку.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...