эквивалент макроса оболочки try..catch в cython

Я обертываю большое количество функций C ++, которые могут вызвать исключение, если основное соединение с сокетом потеряно. Несмотря на то, что я выяснил, как обернуть свою функцию «получить соединение», чтобы восстановить соединение и / или попробовать другие доступные серверы в списке, я не могу найти решение для создания оболочки try..except для предоставления 80 + C ++ функции.

#-- client.pxd ---

cdef extern from "rpc/RpcService.h":
cdef cppclass RpcServiceClient:
void getProject(ProjectT&, Guid& id) nogil except +

cdef extern from "client.h":
cdef cppclass Client:
RpcServiceClient proxy() nogil

cdef Client* getClient() nogil except +#-- module.pxd ---

cdef inline Client* conn() except *:
# wrap getClient() here with try..except if the
# connection was never established

cpdef inline get_project(Guid& guid):
cdef:
ProjectT projT  # cpp object
Project project # cdef python class

# this would catch fine in my conn() wrapper
# if the connection had never been established
# the first time. But if the existing connection
# suddenly drops, it will be getProject() that
# raises the exception
conn().proxy().getProject(projT, guid)

project = initProject(projT)
return project

Любые советы о том, как я могу обернуть все эти функции C ++ в нечто вроде try_call() ?
Если бы это был чистый питон, я мог бы просто сделать что-то вроде этого:

def try_call(fn, *args, **kwargs):
# try fn(*args, **kwargs) and handle

try_call(conn().proxy().getProject, projT, guid)

Но, очевидно, я не могу передать эти функции Cython как объекты Python (или, может быть, я могу?).

Или что-то вроде этого в C ++:

TRY_CALL_OR_RECONNECT
conn().proxy().getProject(projT, guid)
END_TRY_CALL_OR_RECONNECT

7

Решение

Вы можете проверить декораторов

def try_wrapper(x):
try:
x()
except:
doSomethingElse()

@try_wrapper
def defYouWantToWrap():
doSomething()

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector