Есть ли способ декодировать числовые коды ошибки COM в pywin32

Я имел это точное расстраивает сообщение. Что в конечном итоге сработало для меня, это удаление всех файлов и папок внутри / пакетов и разрешение VS повторно извлечь все следующую сборку.

26
задан Salim Fadhley 6 February 2009 в 19:18
поделиться

2 ответа

Вы не делаете ничего плохого. Первый объект в Вашем отслеживании стека (число) является кодом ошибки, возвращенным COM-объектом. Второй объект является описанием, связанным с кодом ошибки, который в этом случае является "Произошедшим Исключением". pywintypes.com_error уже назвал эквивалент win32api. FormatMessage (errCode) для Вас. Мы посмотрим на второе число за минуту.

Между прочим, можно использовать утилиту "Error Lookup", которая прибывает в Visual Studio (C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\ErrLook.exe) как быстрый стартовый стол для проверки кодов ошибок COM. Та утилита также называет FormatMessage для Вас и отображает результат. Не все коды ошибок будут работать с этим механизмом, но многие будут. Это обычно - моя первая остановка.

Обработка ошибок и сообщающий в COM немного грязна. Я попытаюсь дать Вам некоторый фон.

Все вызовы метода COM возвратят цифровой код, названный HRESULT, который может указать на успешность или неуспешность. Все формы сообщения об ошибке в сборке COM вдобавок ко всему

коды обычно выражаются в шестнадцатеричном числе, хотя иногда Вы будете рассматривать их как большие 32-разрядные числа, как в Вашем отслеживании стека. Существуют все виды предопределенных кодов возврата для общих результатов и проблем, или объект может возвратить пользовательские цифровые коды для специальных ситуаций. Например, значение 0 (названный S_OK) универсально не означает "Ошибки", и 0x80000002 является E_OUTOFMEMORY. Иногда коды HRESULT возвращаются объектом, иногда инфраструктурой COM.

COM-объект А может также принять решение предоставить намного более богатую информацию об ошибке путем реализации интерфейса под названием IErrorInfo. Когда объект реализует IErrorInfo, он может обеспечить все виды детали о том, что произошло, такие как подробное пользовательское сообщение об ошибке и даже название справочного файла, который описывает проблему. В VB6 и VBA. эти Err объект позволяет Вам получать доступ ко всей этой информации (Err.Description, и т.д.).

Более того, поздно связанные COM-объекты (которые используют механизм под названием Автоматизация COM или IDispatch) добавляют некоторые слои, которые должны быть очищены прочь для получения информации. Excel обычно управляют через позднее связывание.

Теперь позволяют нам посмотреть на Вашу ситуацию снова. Что Вы получаете, поскольку первое число является довольно универсальным кодом ошибки: DISP_E_EXCEPTION. Примечание: можно обычно выяснять официальное название HRESULT путем поиска с помощью Google числа, хотя иногда необходимо будет использовать шестнадцатеричную версию для нахождения чего-либо полезным.

Ошибки, которые начинаются с DISP_, являются кодами ошибок IDISPATCH. Ошибка свободно означает, что "Было COM-исключение, брошенное объектом", с большей информацией, упакованной в другом месте (хотя я не вполне знаю где; я должен буду искать его).

Из того, что я понимаю pywintypes.com_error, последнее число в Вашем сообщении является фактическим кодом ошибки, который был возвращен объектом во время исключения. Это - фактический цифровой код, что Вы вышли бы из VBA's Err.Number.

, К сожалению, что второй код-2146788248 (0x800A9C68) находится в диапазоне, зарезервированном для определенных пользовательским приложением сообщений об ошибках (в VBA: VbObjectError + someCustomErrorNumber), таким образом, нет никакого централизованного значения. То же число может означать совершенно разные вещи для различных программ.

В этом случае, мы достигли тупика:

код ошибки является "пользовательским", и приложение должно зарегистрировать, каково это, за исключением того, что Excel не делает. Кроме того, Excel (или фактический источник ошибки), кажется, не предоставляет больше информацию через IErrorInfo.

Excel известен (мне, по крайней мере) для загадочных кодов ошибок от автоматизации и неясных ситуаций, которые вызывают их. Это особенно так для ошибок, что можно было рассмотреть "ошибки времени проектирования" ("необходимо было знать лучше, чем вызов метода, который не существует в объекте"). Вместо хорошего "Не мог считать свойство Name", Вы добираетесь" Ошибка времени выполнения '1004': Приложение определенная или определенная объектом ошибка " (который я просто полученный путем попытки получить доступ к свойству Name на Диапазоне, от VBA в Excel). Это не очень полезно.

проблема не направляется на Python, или это - интерфейс к Excel. Сам Excel не объясняет, что произошло, даже к VBA.

Однако общая процедура выше остается действительной. Если Вы получаете ошибку от Excel в будущем, Вы могли бы получить лучшее сообщение об ошибке, что можно отследить тот же путь.

Удачи!

39
ответ дан Euro Micelli 15 October 2019 в 07:42
поделиться

Да пробуют win32api модуль:

import win32api
e_msg = win32api.FormatMessage(-2147352567)

можно захватить любые коды, возвращенные из исключения, и передать их FormatMessage. Ваш пример имел 2 кода ошибок.

7
ответ дан Jason Coon 15 October 2019 в 07:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: