在C ++中,是否可以抛出一个不会被std :: exception捕获的异常?

时间:2009-05-25 21:25:43

标签: c++ exception

问题1:

是否可以抛出一个不会被std :: exception捕获的异常?

try
{
}
catch(std::exception & e)
{
}
catch(...)
{
  //Is this block needed?
}

问题2:

最好是:

catch(std::exception & e)

或者

catch(std::exception e)

或者

catch(const std::exception &e)//<--- this is the method I usually use

4 个答案:

答案 0 :(得分:11)

Q1:是的。你可以抛出任何类型,而不是从std :: exception继承的必要类型 您可以将throw 1;写入throw和int或throw "hello";以抛出char*,这两者都不会从std::exception继承。然而,这被认为是不好的做法,因为班级的用户不能指望你扔任何东西。如果您不想从std::exception继承,那么您通常会创建自己的异常层次结构。

第二季度:按值(第二个选项)捕获异常是一种不好的做法,因为您强制复制异常实例,并且可能会执行可能导致进一步异常的分配。 使用第一个选项建议您打算更改catch块中的e,这也是您可能希望避免的事情,因为异常通常在创建后保持不可变。唯一剩下的就是第三种选择。

答案 1 :(得分:6)

可以肯定的是,你可以抛出你想要的任何类型,而不需要从std::exception派生。

更好地捕获const参考。原因是你可以抛出const或非const,它可以被非const抓住。其作用类似于const的无声抛弃。

答案 2 :(得分:4)

你的第二个问题的答案是你应该按价值投掷并通过引用捕获。如果按价值捕获,可能会得到“object slicing”。

答案 3 :(得分:0)

有时需要抛出一个不从std :: exception继承的异常。在运送共享库时,最佳做法是重新实现或包装大多数std库类型,而不是直接暴露使用它们的方法/函数,因为它可能导致各种链接器/编译器互操作性问题。