qt5和python3交互时的异常捕获

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 其他的网上都有,前两点找了很久才找到,特地补充整合一下
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

常数0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值