c++ 抛出和抛出与异常的异常有什么区别?

想象一下两个相似的代码:

try {
  [...]
} catch (myErr &err) {
  err.append("More info added to error...");
  throw err;
}

try {
  [...]
} catch (myErr &err) {
  err.append("More info added to error...");
  throw;
}

这些实际上是一样的还是有些微妙的区别?例如,第一个是否导致复制构造函数被运行,而第二个可以重用同一个对象来重新抛出它?

最佳答案
根据您如何排列异常层次结构,通过在throw语句中命名异常变量重新抛出异常可能会切割原始异常对象。

无参数throw表达式将抛出当前的异常对象来保留其动态类型,而带有参数的throw表达式将根据抛出的参数的静态类型抛出新的异常。

例如。

int main()
{
    try
    {
        try
        {
            throw Derived();
        }
        catch (Base& b)
        {
            std::cout << "Caught a reference to base\n";
            b.print(std::cout);
            throw b;
        }
    }
    catch (Base& b)
    {
        std::cout << "Caught a reference to base\n";
        b.print(std::cout);
    }

    return 0;
}

如上所述,程序将输出:

Caught a reference to base
Derived
Caught a reference to base
Base

如果抛出b替换为throw,则外部catch也将捕获最初抛出的Derived异常。如果内部类通过值而不是通过引用捕获Base异常,这仍然成立 – 尽管这本来意味着原始异常对象不能修改,所以对b的任何更改都不会反映在外部块捕获的派生异常中。

转载注明原文:c++ 抛出和抛出与异常的异常有什么区别? - 代码日志