我有一个函数,它可能引发变量类型的异常,但是所有从std::exception继承的:
int errorCheck(int a)
{
if(a < 0)
throw a_too_small();
if(a>10)
throw a_too_big();
return a*2;
}我想使用Qt的信号/插槽机制来处理这个异常。
try {
errorCheck(a);
} catch(std::exception &e) {
emit errorSignal(e);
}如果errorSignal的签名是errorSignal(std::exception e),则对原始异常对象进行切片,并丢失其类型。另一方面,如果签名是errorSignal(std::exception &e),则异常e将保留捕获范围,我认为这是不允许的。
处理这个问题的最干净的解决方案是什么?
发布于 2017-04-11 12:53:06
如果可以使用C++11,则可以尝试使用std::exception_ptr。
try {
...
} catch (...)
std::exception_ptr except = std::current_exception();
emit signal(except);
}然后在你的插槽里:
void myslot(std::exception_ptr e) {
try {
if (e) {
std::rethrow_exception(e);
}
} catch (...) {
...
}
}发布于 2017-04-11 12:53:22
如何使errorSignal函数信号/时隙参照工作?有点像errorSignal(std::exception& e)?使用Qt::DirectConnection也可以这样做,以避免事件队列,如下所示:
connect(someWidget,SomeWidget::errorSignal&,this,MainWindow::handleError&,Qt::DirectConnection);https://stackoverflow.com/questions/43346313
复制相似问题