2011-01-26 11 views
6

Używam biblioteki, która określa w dokumentach API definicję klasy odziedziczonej z określonej klasy biblioteki. Sama biblioteka jest napisana w C++, a powiązania z Pythonem są generowane za pomocą SWIG. Problem polega na tym, że gdy uruchamiam swój kod Pythona, niezależnie od tego, jaki wyjątek rzuca Python, pojawia się komunikat "zakończ połączenie wywołane po wyrzuceniu instancji" Swig :: DirectorMethodException "".SWIG: Zgłaszanie wyjątków w języku Python z kodu C++

Chciałbym, aby ten wyjątek został podniesiony przez kod Pythona do zgłaszania podczas wykonywania mojego programu. Esp, te przypadki, w których otrzymuję ZeroDivisionError.

Próbowałem nieco zhakować, stosując metodę opisaną w dokumentacji SWIG pod numerem http://www.swig.org/Doc2.0/Python.html#Python_nn36, ale bez powodzenia. Nadal dostaję ten sam komunikat "zakończyć wywołanie po wyrzuceniu instancji" Swig :: DirectorMethodException "" bez względu na to, co umieściłem w pliku module.i.

Czy ktoś może mi podać wskazówki, jak rozwiązać ten problem, aby wyjątki Python były zgłaszane tak jak są?

Odpowiedz

1

Nie wiem, jak daleko jesteś z bazy kodu, więc to może być mało użyteczne, ale miałem więcej szczęścia z boost :: python niż SWIG. Następnie można to zrobić: boost::python Export Custom Exception

+1

Dzięki za pomoc. Naprawiłem ten problem i poprawka jest tutaj: https://github.com/madhusudancs/mesos/commit/93ed9f32d8752d687d6b6af6bcb6bfdf815f115d To było dość proste, ale zdecydowanie nie jest dobrze udokumentowane. Nie jest to także mój projekt, więc mogę tylko zaproponować programistom użycie boost :: python, ale nie mogę tego zrobić, chociaż –

+0

Pomyślałem, że SWIG jest obowiązkowy; Chciałem opuścić opcję zwiększania dla osób, które natknęły się na to pytanie jak ja :). A teraz mają też SWIG. – ginbot

2

Zgłoś wyjątek zgłoszony przez Python w konsoli programu.

To jest przydatna poprawka od Madhusudan.C.S. Zobacz jego komentarz na odpowiedź ginbota. Ustanawiam to jako odpowiedź, aby stała się bardziej widoczna.

/* MyInterface.i */ 
%module(directors="1") MyInterface 
%feature("director:except") { 
    if($error != NULL) { 
     PyObject *ptype, *pvalue, *ptraceback; 
     PyErr_Fetch(&ptype, &pvalue, &ptraceback); 
     PyErr_Restore(ptype, pvalue, ptraceback); 
     PyErr_Print(); 
     Py_Exit(1); 
    } 
} 
Powiązane problemy