【问题标题】:Way to throw exceptions out of several function calls all the way back to main?从几个函数调用中抛出异常一直回到主函数的方法?
【发布时间】:2016-01-11 17:09:28
【问题描述】:

从多个函数调用中抛出异常一直到 main 的“正确”方法是什么?

我现在做的是例如:

void foo() {
    ...
    try {
    ...
    }catch(a1) {
            ...
        throw(a2);
    }
    ...
}

void baz() {
    ...
    try {
        foo();
    }catch(a2) {
        ...
        throw(a3);
    }
    ...
}

必须有更好的方法来抛出结果并退出调用堆栈,而不会在途中捕获每个异常,是吗?

【问题讨论】:

  • 如果你不需要,就不要抓住它们。
  • @πάνταῥεῖ 但它会一直回到 main 吗?
  • 随便扔,让它一路掉下去。只需一个 try/catch 将函数调用包装在 main 中,最终导致 throw
  • 哦,太酷了,我不知道它是这样工作的。谢谢。我应该关闭它吗?
  • @kuhaku,这个特性是异常存在的全部原因。没有它,它们就不会比返回代码提供太多优势。

标签: c++ c++11 syntax exception-handling


【解决方案1】:

每个 [except.throw]

当抛出异常时,控制权转移到最近的具有匹配类型的处理程序(15.3); “最近”是指 try 关键字后面的复合语句或 ctor-initializer 最近被控制线程输入但尚未退出的处理程序。

这意味着如果抛出异常并且没有任何处理程序与其类型匹配,则异常将向上传播,直到找到一个或没有找到。你可以在这个小例子中看到它的工作原理

#include <iostream>
#include <exception>

void foo3() { std::exception e; throw(e); }

void foo2() { try { foo3(); } catch (std::bad_exception){} }

void foo() { foo2(); }


int main()
{
    try
    {
       foo();
    }
    catch (std::exception & e)
    {
        std::cout << "caught in main()";
    }
}

输出:

caught in main()

Live Example

【讨论】:

  • 我仍然认为,“处理程序”这个表达令人困惑,因为它暗示了堆栈中的某些东西——比如信号处理程序函数。任何解释(以及标准)都应该清楚地表明,当前作用域是离开的,并且退出了零个或多个函数调用。应避免使用“处理程序”这一表达,而应使用“catch-block”之类的内容。甚至更好的“enclosure-catch-block”。为什么有人要更改捕获的异常。
猜你喜欢
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
相关资源
最近更新 更多