首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用异常外部catch语句

如何使用异常外部catch语句
EN

Stack Overflow用户
提问于 2017-04-11 12:45:23
回答 2查看 75关注 0票数 0

我有一个函数,它可能引发变量类型的异常,但是所有从std::exception继承的:

代码语言:javascript
运行
复制
int errorCheck(int a)
{
  if(a < 0)
    throw a_too_small();
  if(a>10)
    throw a_too_big();
  return a*2;
}

我想使用Qt的信号/插槽机制来处理这个异常。

代码语言:javascript
运行
复制
try {
  errorCheck(a);
} catch(std::exception &e) {
  emit errorSignal(e);
}

如果errorSignal的签名是errorSignal(std::exception e),则对原始异常对象进行切片,并丢失其类型。另一方面,如果签名是errorSignal(std::exception &e),则异常e将保留捕获范围,我认为这是不允许的。

处理这个问题的最干净的解决方案是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-11 12:53:06

如果可以使用C++11,则可以尝试使用std::exception_ptr

代码语言:javascript
运行
复制
try {
  ...
} catch (...)
  std::exception_ptr except = std::current_exception();
  emit signal(except);
}

然后在你的插槽里:

代码语言:javascript
运行
复制
void myslot(std::exception_ptr e) {
  try {
    if (e) {
      std::rethrow_exception(e);
    }
  } catch (...) {
    ...
  }
}
票数 3
EN

Stack Overflow用户

发布于 2017-04-11 12:53:22

如何使errorSignal函数信号/时隙参照工作?有点像errorSignal(std::exception& e)?使用Qt::DirectConnection也可以这样做,以避免事件队列,如下所示:

代码语言:javascript
运行
复制
connect(someWidget,SomeWidget::errorSignal&,this,MainWindow::handleError&,Qt::DirectConnection);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43346313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档