我有一个函数可能会抛出变量类型的异常,但所有函数都继承自std :: exception:
int errorCheck(int a)
{
if(a < 0)
throw a_too_small();
if(a>10)
throw a_too_big();
return a*2;
}
我想使用Qt的SIGNAL / SLOT机制来处理这个异常。
try {
errorCheck(a);
} catch(std::exception &e) {
emit errorSignal(e);
}
如果errorSignal
的签名是errorSignal(std::exception e)
,则原始异常对象将被切片并且其类型将丢失。
如果签名是errorSignal(std::exception &e)
,则异常e
会离开捕获范围,我相信这是不允许的。
解决这个问题的最简洁的解决方案是什么?
答案 0 :(得分:3)
如果可以使用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 (...) {
...
}
}
答案 1 :(得分:0)
如何通过引用使errorSignal
函数信号/插槽工作?像errorSignal(std::exception& e)
之类的东西?也可以使用Qt::DirectConnection
来避免事件排队,例如:
connect(someWidget,SomeWidget::errorSignal&,this,MainWindow::handleError&,Qt::DirectConnection);