2011-02-17 3 views
1

나는이 코드 snnipet있어 (전체 프로그램 컴파일 및 링크 정확하게) :파이썬 예외 구문 오류 텍스트 (부스트 라이브러리)

... 
try 
{ 
    boost::python::exec_file(
     "myscript.py",   // this file contains a syntax error 
     my_main_namespace, 
     my_local_namespace 
    ); 
    return true; 
} 
catch(const boost::python::error_already_set &) 
{ 
PyObject *ptype, *pvalue, *ptraceback; 
PyErr_Fetch(&ptype, &pvalue, &ptraceback); 

    // the next line crashes on syntax error 
    std::string error = boost::python::extract<std::string>(pvalue); 
    ... 
} 

프로그램에 구문 오류가 있습니다 실행하려고 파일, 그래서 예외가 던져진다. 프로그램이 오류 메시지를 가져 오려고 할 때 ...

이 코드는 런타임 오류와 잘 맞지만 구문 오류로 인해 충돌합니다.

어떻게 이런 종류의 오류가있는 오류 문자열을 얻을 수 있습니까? documentation of PyErr_Fetch에서 미리

답변

4

에서

감사합니다 "유형의 객체가없는 경우에도 값 및 역 추적 객체가 NULL이 될 수 있습니다." 값을 추출하기 전에 pvalue가 NULL인지 여부를 확인해야합니다.

std::string error; 
if(pvalue != NULL) { 
    error = boost::python::extract<std::string>(pvalue); 
} 

당신은 예외가 당신이 here 나와있는 예외 유형에 대해 p- 형과 비교할 수있는 구문 에러가 있는지 여부를 확인하려면

.

더 이상 구체적으로 대답하려면 추락 지점에서 백 트레이스가 필요합니다. 당신이 예외의 캐릭터 라인 표현을 얻을 수 PyObject_Str를 사용해야하므로

편집

유의 확률은 예외 객체가 아닌 STR 인스턴스입니다.

먼저 PyErr_NormalizeException으로 전화하여 pvalue를 올바른 예외 유형으로 변환해야 할 수 있습니다.

+0

흠 ... pvalue가 NULL이 아니고 ptraceback이 NULL입니다 (구문 오류로 인해 의미가 있으며 스택 프레임이 없습니다) – jab

+0

솔루션이 모든 오류에 대해 잘 작동하는 것 같습니다! – jab