2013-05-02 23 views
7

Temel yuva soketinin kaybolması durumunda bir istisna oluşturabilen çok sayıda C++ işlevini sarar. Bağlantıyı yeniden kurmak ve/veya bir listedeki diğer mevcut sunucuları denemek için "bağlantı kur" işlevini nasıl değiştireceğimi anladım, ancak 80 sağlamak için bir try..except sarıcı oluşturmak için bir çözüm bulamıyorum. + C++ fonksiyonları.try..catch makro sarıcı eşdeğeri cython

#-- 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 

Ben try_call() gibi bir şey bu C++ işlevlerin hepsi sarmak nasıl herhangi bir ipucu?

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

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

Ama açıkçası ben piton nesneler olarak bu Cython işlevlerini geçemez (ya da belki elimden?): Bu saf piton olsaydı , ben sadece böyle bir şey yapabilirdi.

Veya C++ böyle bir şey:

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

Eğer bunu C++ 'da ve saf Python'da nasıl yapacağınızı biliyor iseniz ... Cython'da bunu yapmak için bir nedeniniz var mı? Neden her bir işleve makroyu yapıştıran bir C++ sarmalayıcısı yazmasın, sonra bunu Cython'a sarın veya Python tarafından eşdeğer olan Cython kodunun etrafına bir Python sarıcısı yazın. – abarnert

+0

Sadece sezgilerden uzaklaşıyor, ama ben, sodhon işlevlerini python nesneleri olarak kullanamayacağınız için hiçbir neden görmüyorum. Sonuçta, C vb. Uygulanan kütüphane fonksiyonları da python işlev nesneleri olarak geçirilebilir. – azgult

+0

@abarnert: Sardığım orijinal C++ işlevlerini değiştiremiyorum. Her bir çağrı etrafında bu makro sarmalayıcıları yerleştirmek için C++ alanında hiçbir yer yoktur. Bunu cython'da yapıyorum çünkü tüm modül cython. Aksi takdirde, cython modülünü içe aktaran ve her aramayı tamamlayan saf bir python sarıcı yazmam gerekirdi. – jdi

cevap

0

bu iyi öğretici olmayabilir

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

@try_wrapper 
def defYouWantToWrap(): 
    doSomething() 

dekoratörler kontrol etmek isteyebilirsiniz, ama umarım doğru yönde işaret edebilir

+0

bu sadece python işlevleri için çalışır, ben C++ işlevleri çağırdığımda değil – jdi