7

我包装了大量的 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()?如果这是纯 python,我可以简单地做这样的事情:

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
4

1 回答 1

0

你可能想看看装饰器

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

@try_wrapper
def defYouWantToWrap():
    doSomething()

这可能不是最好的教程,但希望它可以为您指明正确的方向

于 2013-05-10T16:08:13.513 回答