2011-01-26 7 views
6

라이브러리의 특정 클래스에서 상속 된 클래스를 API 문서에서 지정하는 라이브러리를 사용하고 있습니다. 라이브러리 자체는 C++로 작성되었으며 Python에 대한 바인딩은 SWIG를 사용하여 생성됩니다. 문제는 파이썬이 어떤 예외를 던질지라도 파이썬 코드를 실행할 때 " 'Swig :: DirectorMethodException'인스턴스를 던진 후에 종료된다는 오류가 발생한다는 것입니다.SWIG : C++ 코드에서 파이썬 예외보고하기

내 프로그램을 실행하는 동안보고 될 Python 코드로이 예외를 발생시키고 싶습니다. Esp, 내가 ZeroDivisionError를 얻는 사례.

SWIG 설명서에 설명 된 방법을 따르고 (행운을 들이지 말고 http://www.swig.org/Doc2.0/Python.html#Python_nn36) 약간의 해킹을 시도했습니다. 나는 여전히 같은 메시지를 받는다. "module : i 파일에 무엇을 넣든간에 'Swig :: DirectorMethodException'의 인스턴스를 던진 후에 호출된다.

파이썬 예외가 그대로보고 될 수 있도록이 문제에 대해 알려줄 수있는 사람이 있습니까?

답변

1

나는 당신이 당신의 코드베이스입니다 함께 얼마나 모르는, 그래서 이것은 거의 사용 될 수있다,하지만 난 꿀꺽 꿀꺽보다 부스트 :: 파이썬와 함께 더 나은 행운을했다. 그러면 다음을 할 수 있습니다 : boost::python Export Custom Exception

+1

도움 주셔서 감사합니다. 나는 실제로이 문제를 고쳤으며 수정본은 여기에있다. https://github.com/madhusudancs/mesos/commit/93ed9f32d8752d687d6b6af6bcb6bfdf815f115d 아주 간단했으나 잘 설명되지 않았다. 또한이 프로젝트는 내 프로젝트가 아니므로 개발자는 boost :: python을 사용하도록 제안 할 수는 있습니다.하지만이 작업을 수행 할 수는 없습니다. –

+0

SWIG가 필수적이라고 생각했습니다. 나는 나와 같은이 질문에 비틀 거리는 사람들에게 부스트 옵션을 남기기를 원했다. 그리고 이제 그들은 SWIG도 가지고 있습니다. – ginbot

2

프로그램 콘솔에서 파이썬에 의해 발생한 예외를보고하십시오.

이것은 Madhusudan.C.S의 유용한 픽스입니다. ginbot의 답변에 대한 주석을 참조하십시오. 좀 더 눈에 잘 띄도록 대답으로 넣고 있습니다.

/* 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); 
    } 
}