2012-07-12 2 views
2

boost::python Export Custom Exception에 대한 대답은 C++에서 사용자 정의 예외 클래스를 내보내는 방법을 보여주고 Boost.Python custom exception class은 파이썬의 예외에서 상속 한 예외 클래스를 내보내는 방법을 보여줍니다. 어떻게 둘 다 할 수 있습니까? 그것은 정보를 검색하는 커스텀 메소드를 가지고 있고 그 클래스를 Python의 Exception에서 파생시키는 예외 클래스를 노출합니다.boost :: python 커스텀 예외 내보내기 및 파이썬 예외로부터 상속

답변

2

Jim Bosch가 C++-sig list에서 제안하는 실행 가능한 솔루션은 래핑 된 C++ 예외를 상속하는 대신 컴포지션을 사용하는 것입니다. 코드는 here처럼 파이썬 예외를 생성 한 다음 래핑 된 C++ 예외를 파이썬 예외의 인스턴스 변수로 추가해야합니다.

void translator(const MyCPPException &x) { 
    bp::object exc(x); // wrap the C++ exception 

    bp::object exc_t(bp::handle<>(bp::borrowed(exceptionType))); 
    exc_t.attr("cause") = exc; // add the wrapped exception to the Python exception 

    PyErr_SetString(exceptionType, x.what()); 
} 

래핑 된 C++ 예외

다음과 같이 파이썬에서 액세스 할 수 있습니다

try: 
    ... 
except MyModule.MyCPPExceptionType as e: 
    cause = e.cause # wrapped exception can be accessed here 

하지만 예외도

try: 
    ... 
except Exception: 
    ... 
+1

참고하는'exc_t.attr ("원인에 의해 잡힐 것 ") = exc;'C++ 예외 인스턴스를 속성으로 사용하여 Python 예외 * class *에 추가합니다. 따라서 파이썬에서 예외 인스턴스 e1을 포착하고 이에 대한 참조를 유지하면 이러한 C++ 예외의 두 번째 발생으로 인해 e1의 원인 속성이 새 C++ 예외 인스턴스를 참조하도록 변경됩니다. – Holger