qt5和python3交互时的异常捕获
一、使用步骤
1.代码实例
代码如下(示例):
#include "MainWindow.h"
#include "ui_MainWindow.h"
#pragma push_macro("slots")
#undef slots
#include "Python.h"
#include "frameobject.h"
#include "compile.h"
#pragma pop_macro("slots")
#include <QDebug>
#include <iostream>
using namespace std;
void MainWindow::fetch_error()
{
PyObject *type = nullptr;
PyObject *value = nullptr;
PyObject *traceback = nullptr;
PyErr_Fetch(&type, &value, &traceback);
//PyErr_NormalizeException(&type, &value, &traceback);
if (type)
{
qDebug()<<"error Type" << PyExceptionClass_Name(type);
}
if (value)
{
PyObject *line = PyObject_Str(value);
char* s;
int ok = PyArg_Parse(line, "z", &s);
qDebug()<<"error reason -- "<<ok<<","<<s;
}
if (traceback)
{
PyTracebackObject *tb = (PyTracebackObject *)traceback;
for (;tb != nullptr; tb = tb->tb_next)
{
PyCodeObject *codeobj = tb->tb_frame->f_code;
char* fillePath;
int ok = PyArg_Parse(codeobj->co_filename, "z", &fillePath);
qDebug()<<"filePath -- "<<ok<<","<<fillePath;
char* funcName;
ok = PyArg_Parse(codeobj->co_name, "z", &funcName);
qDebug()<<"funcName -- "<<ok<<","<<funcName;
qDebug()<<"lineNum -- "<<tb->tb_lineno;
}
}
}
# 总结
1 主要是记录一下,所要引入的头文件
#pragma push_macro("slots")
#undef slots
#include "Python.h"
#include "frameobject.h"
#include "compile.h"
#pragma pop_macro("slots")
2 主要是记录一下,把PyCodeObject对象转成QString的方法
PyArg_Parse,这个函数
3 其他的网上都有,前两点找了很久才找到,特地补充整合一下