Текст исключения Python при синтаксических ошибках (расширенная библиотека) - PullRequest
1 голос
/ 17 февраля 2011

У меня есть этот фрагмент кода (вся программа правильно компилируется и связывается):

...
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);
    ...
}

Файл, который пытается выполнить программа, имеет синтаксическую ошибку, поэтому возникает исключение.Когда программа пытается получить сообщение об ошибке, происходит сбой ...

Код хорошо работает с ошибками времени выполнения, но каким-то образом происходит сбой с ошибками синтаксиса.

Как я могу получить строку ошибки с такого рода ошибками?

Заранее спасибо

1 Ответ

4 голосов
/ 17 февраля 2011

Из документации PyErr_Fetch : «Объект value и traceback может иметь значение NULL, даже если объект типа не равен».Вы должны проверить, имеет ли значение pvalue значение NULL или нет, прежде чем пытаться извлечь значение.

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

Если вы хотите проверить, является ли исключение SyntaxError, вы можете сравнить ptype с перечисленными типами исключений здесь .

Чтобы ответить более конкретно, мне понадобится обратный след от того места, где он разбился.

Edit

pvalue является объектом исключения,не является экземпляром str, поэтому вы должны использовать PyObject_Str , чтобы получить строковое представление исключения.

Возможно, вам сначала потребуется вызвать PyErr_NormalizeException , чтобы превратить pvalue в правильное исключениетипа.

...