Вызов был отклонен вызываемым абонентом: возможное решение, но похоже, что ошибка com не зафиксирована должным образом - PullRequest
0 голосов
/ 18 июня 2020

Я уже давно ищу решение этой проблемы. К сожалению, большая часть того, что было опубликовано на SO, не совсем попала в цель. Я увидел решение на внешнем веб-сайте и немного подправил его.

Я показал некоторые из моих кодов ниже, на высоком уровне все, что он делает, это открывает несколько Excel (по одному), запускает макросы VBA и другие задачи перед их закрытием.

Я создал класс ComWrapper, который будет обертывать существующую функцию с именем openWorkbook, и когда он выдает com_error, он будет ждать некоторое время 5se c в этом случае и снова вызывать функцию.

Проблема в том, что класс не улавливает кажущуюся ошибку com. Я добавил оператор печати под except com_error as e:, чтобы проверить, фиксирует ли исключение ошибку вообще, но не выглядит ли оно когда-либо захваченным. Я использую python 3.6.10. что я здесь делаю не так?

фрагменты моих кодов ниже

from pywintypes import com_error
import win32com.client


class ComWrapper:

    @staticmethod
    def wrap(func, *func_args):
        try:
            print('running the function')
            return func(*func_args)

        except com_error as e:
            print('checking the error')
            if e.strerror == 'Call was rejected by callee.':
                print('com_error retrying ', e)
                time.sleep(5)
                wrap(func, *func_args)

            raise


def openWorkbook(xlapp, xlfile,upDateLink,openReadOnly,wbVisible):
    xlapp.Workbooks.Open('C:\\blp\\API\\Office Tools\\BloombergUI.xla')
    xlapp.RegisterXLL('C:/blp/API/Office Tools/bofaddin.dll')
    xlwb = xlapp.Workbooks.Open(xlfile,upDateLink,openReadOnly)
    xlapp.Visible = wbVisible
    return(xlwb)

xlapp = win32com.client.DispatchEx("Excel.Application")
wbVisible = isVisible
wb1 = ComWrapper.wrap(openWorkbook, xlapp, filepath1, False, True, wbVisible)
wb_addin = ('C:/blp/API/Office Tools/bofaddin.dll')
#performe tasks - run vba macros etc#

wb1.Close(True, fileSaveAspath1)
xlapp.Quit()
del xlapp


xlapp = win32com.client.DispatchEx("Excel.Application")
wbVisible = isVisible
wb2 = ComWrapper.wrap(openWorkbook, xlapp, filepath2, False, True, wbVisible)
wb_addin = ('C:/blp/API/Office Tools/bofaddin.dll')
#performe tasks - run vba macros etc#

wb2.Close(True, fileSaveAspath2)
xlapp.Quit()
del xlapp
...