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