Как получить текст исключения Python

:g//p

В его более длинной форме:

:global/regular-expression/print

можно не учесть pattern/regex, и Vim снова использует предыдущий критерий поиска.

Мелочи: инструмент grep назвали в честь этой последовательности команды.

46
задан Anton Kiselev 13 September 2009 в 18:11
поделиться

2 ответа

Ну, я узнал, как это сделать.

Без повышения ( только сообщение об ошибке, потому что код для извлечения информации из трассировки слишком тяжел, чтобы размещать его здесь):

PyObject *ptype, *pvalue, *ptraceback;
PyErr_Fetch(&ptype, &pvalue, &ptraceback);
//pvalue contains error message
//ptraceback contains stack snapshot and many other information
//(see python traceback structure)

//Get error message
char *pStrErrorMessage = PyString_AsString(pvalue);

И версия BOOST

try{
//some code that throws an error
}catch(error_already_set &){

    PyObject *ptype, *pvalue, *ptraceback;
    PyErr_Fetch(&ptype, &pvalue, &ptraceback);

    handle<> hType(ptype);
    object extype(hType);
    handle<> hTraceback(ptraceback);
    object traceback(hTraceback);

    //Extract error message
    string strErrorMessage = extract<string>(pvalue);

    //Extract line number (top entry of call stack)
    // if you want to extract another levels of call stack
    // also process traceback.attr("tb_next") recurently
    long lineno = extract<long> (traceback.attr("tb_lineno"));
    string filename = extract<string>(traceback.attr("tb_frame").attr("f_code").attr("co_filename"));
    string funcname = extract<string>(traceback.attr("tb_frame").attr("f_code").attr("co_name"));
... //cleanup here
54
ответ дан 26 November 2019 в 20:29
поделиться

В API Python C PyObject_Str возвращает новую ссылку на строковый объект Python со строковой формой объекта Python, который вы передаете в качестве аргумента - просто например str (o) в коде Python. Обратите внимание, что объект исключения не имеет «такой информации, как номер строки» - это в объекте трассировки (вы можете использовать PyErr_Fetch для получения как объекта исключения, так и объекта трассировки). Не знаю, что (если вообще) Boost предоставляет, чтобы упростить использование этих конкретных функций C API, но в худшем случае вы всегда можете прибегнуть к этим функциям, поскольку они предлагаются в самом C API.

7
ответ дан 26 November 2019 в 20:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: