如何在catch语句之外使用异常

时间:2017-04-11 12:45:23

标签: c++ qt

我有一个函数可能会抛出变量类型的异常,但所有函数都继承自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会离开捕获范围,我相信这是不允许的。

解决这个问题的最简洁的解决方案是什么?

2 个答案:

答案 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);