首页 > 解决方案 > 为什么 `catch` 在这里接球?

问题描述

我不太确定这里发生了什么。很明显,为什么内扣子能抓到throw 2,而外扣子为什么catch(int x)要抓throw呢?我认为catch(int x)应该只捕获整数值。是否有可能第二次throw抛出第一次咳嗽(即 2)?

try
{
    try
    {
        throw 2;
    }
    catch (int n)
    {
        std::cout << "Inner Catch " << n << std::endl;
        throw;
    }
}
catch (int x)
{
    std::cout << "Outer Catch " << x << std::endl;
}

谢谢!

标签: c++try-catch

解决方案


你不能throw什么都没有。throw;单独可以在 catch-block 中使用以重新抛出当前处理的异常。从cppreference

重新抛出当前处理的异常。放弃当前 catch 块的执行并将控制权传递给下一个匹配的异常处理程序(但不传递给同一 try 块之后的另一个 catch 子句:它的复合语句被认为已“退出”),重用现有的异常对象:没有新的对象产生。仅当当前正在处理异常时才允许使用此形式(如果以其他方式使用,则调用 std::terminate)。如果在构造函数上使用,与 function-try-block 关联的 catch 子句必须通过重新抛出来退出。


我认为 catch(int x) 应该只捕获整数值

这就是它的作用。

第二次投掷是否有可能抛出第一次咳嗽(即 2)?

正是这样。


推荐阅读