gpt4 book ai didi

c++ - 通过 QT 的信号/槽系统传递通用异常作为参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:49:06 27 4
gpt4 key购买 nike

当我捕捉到一个异常时,我想发出一个信号并将该异常传递给一个插槽,以便它可以在不同的线程中处理。信号和槽使用 Qt:QueuedConnection 类型连接。

我首先尝试了这个:

/*in .h*/
signals:
void exceptionOccured(const std::exception &e);
public slots:
void exceptionReceive(const std::exception &e);

/*in .cpp*/
connect(this,SIGNAL(exceptionOccured(const std::exception&)),this,SLOT(exceptionReceive(const std::exception&)),Qt::QueuedConnection);

try {
throw std::runtime_error("test");
} catch (std::exception &e) {
emit exceptionOccured(e);
}

这有点管用,但是当 QT 复制要放置在队列中的引用对象时,exceptionReceived 槽接收到一个 std::exception 类型的对象并且所有附加信息都丢失了。

然后我尝试传递一个指向原始异常对象的指针,但这给我带来了一个问题,即在调用槽时实际对象已经消失了。

我如何才能告诉 QT 正确复制异常(实际应用程序从 std::exception 继承了多个级别)或将捕获的异常转换为某种安全指针类型(即从堆栈到堆左右)。

附言该对象将消息发送给自身,因为 try/catch 语句是使用 QtConcurrent::run() 从 lambda 函数运行的;

最佳答案

std::exception_ptr被添加到标准的 C++11 中以准确解决这个问题。 std::current_exception() 让您获得当前异常的句柄,然后您可以传递它并在您想要的任何线程中重新抛出它。

详情请访问 http://en.cppreference.com/w/cpp/error/exception_ptr .

关于c++ - 通过 QT 的信号/槽系统传递通用异常作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32411836/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com