为什么 `catch` 会在这里接住投掷?

use*_*447 4 c++ try-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;
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

for*_*818 8

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

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


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

这就是它的作用。

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

正是这样。

  • @user3265447 除了在引发异常时常用之外,“std::exception”没有什么特别的。您可以“抛出”和“捕获”,而无需涉及任何“std::exception”。是的,catch 块之外的 `throw;` 将调用 `std::terminate` (2认同)