问题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
答案 0 :(得分:11)
Q1:是的。你可以抛出任何类型,而不是从std :: exception继承的必要类型
您可以将throw 1;
写入throw和int或throw "hello";
以抛出char*
,这两者都不会从std::exception
继承。然而,这被认为是不好的做法,因为班级的用户不能指望你扔任何东西。如果您不想从std::exception
继承,那么您通常会创建自己的异常层次结构。
e
,这也是您可能希望避免的事情,因为异常通常在创建后保持不可变。唯一剩下的就是第三种选择。
答案 1 :(得分:6)
可以肯定的是,你可以抛出你想要的任何类型,而不需要从std::exception
派生。
更好地捕获const
参考。原因是你可以抛出const
或非const
,它可以被非const
抓住。其作用类似于const
的无声抛弃。
答案 2 :(得分:4)
你的第二个问题的答案是你应该按价值投掷并通过引用捕获。如果按价值捕获,可能会得到“object slicing”。
答案 3 :(得分:0)
有时需要抛出一个不从std :: exception继承的异常。在运送共享库时,最佳做法是重新实现或包装大多数std库类型,而不是直接暴露使用它们的方法/函数,因为它可能导致各种链接器/编译器互操作性问题。