2010-06-01 1 views
6

Я говорю с COM-объектом (объект Microsoft ADO Recordset). В определенном случае записи вернут неудачу (т.е. отрицательные) HRESULT, с сообщением:COM: Как обрабатывать конкретное исключение?

товар не может быть найден в коллекции , соответствующей запрашиваемое имя или порядкового

я знаю что это сообщение об ошибке означает, знаете, почему это произошло, и как это исправить. Но я знаю это, потому что я прочитал сообщение, которое, к счастью, было на понятном мне языке.

Теперь я хотел бы обработать это исключение специально. Объект COM бросил HRESULT из

0x800A0CC1 

В идеальном мире Microsoft будет документально what errors can be returned при попытке доступа:

records.Fields.Items(index) 

с неправильным индексом. Но они этого не делают; они больше всего они говорят, что ошибка может произойти, т.е .:

Если Пункт не может найти объект в коллекции соответствующего аргумента Index , возникает ошибка.

Учитывая, что возвращаемый код ошибки не документирована, является его правильно обрабатывать определенный код возврата `0x800A0CC1' , когда я пытаюсь поймать исключение:

Элемент не может быть найдено в коллекции соответствующих запрашиваемое имя или порядковое

?

Поскольку Microsoft не документировала код ошибки, они технически изменить его в будущем.

ответ

4

Они сделали документ этот код ошибки, но это трудно найти: ErrorValueEnum:

adErrItemNotFound 3265 -2146825023 0x800A0CC1 Item cannot be found in the collection that corresponds to the requested name or ordinal. 

..so, так как его документированной код ошибки, это безопасно для проверки явным образом.

+0

В двух идентичных ответах упоминается, что документация на ошибки, вызванные свойством, не документируется с помощью свойства. Но ваша принята, потому что вы цитировали документы и привязывались к ней. Плюс, с 1k rep, вы держите принятые ответы больше, чем Ханс (извините Ханса, но это правда) –

3

Вам нужно будет решить, стоит ли ему рисковать, но я считаю, что маловероятно, что Microsoft изменит этот код ошибки. Проверка этого конкретного кода ошибки является довольно надежным способом.

+0

Согласовано - когда вы Google код ошибки, вы можете найти сообщения, ссылающиеся на него, которые датируются 2002 годом на первой странице результатов, поэтому он hasn По крайней мере, это изменилось. – Paddyslacker

+0

Прочитав блог Раймонда Чена так долго, я остро осознаю, как неправильно полагаться на недокументированное поведение; это ограничивает способность Microsoft улучшать и внедрять инновации. –

1

Да, это нормально. Это фактически документированный код ошибки, хотя найти их никогда не бывает легко. Он определен в файле SDDA msdao15.idl, adErrItemNotFound (ошибка 3265)