以下是否有任何陷阱;
if (someCondition)
throw boost::shared_ptr<SomeException>( new SomeException( "foo!" ) );
...
catch( const boost::shared_ptr<SomeException>& expRef )
{
}
答案 0 :(得分:6)
你应该避免使用指针投掷,而更喜欢throwing by value和catching by (const) reference。
使用智能指针是一种在使用指针时简化资源管理的方法,但如果您可以完全避免使用指针,那么这样做会更简单。只要抛出一个值。
答案 1 :(得分:4)
是的,有一个陷阱。您将无法根据基类捕获:
void f()
{
throw std::runtime_error("look here");
}
void g()
{
throw boost::shared_ptr<std::runtime_error>("look here");
}
int main()
{
try
{
f();
}
catch ( std::exception const& e) {}
try { g(); }
catch ( boost::shared_ptr<std::exception> const& e) {} // no work
}
你当然可以把它扔在基础上,但是你不能抓住派生的。
所以是的......不要这样做。
答案 2 :(得分:1)
我能看到的唯一陷阱是,当你不必要时,你正在以艰难的方式做事。 : - )
通常使用shared_pointer来管理对象的生命周期,否则不明显。很明显,管理抛出的异常不是你的责任。编译器必须为你做到这一点!
处理异常时,运行时将销毁shared_pointer,然后销毁异常对象。否则运行时会直接销毁异常对象!你有什么收获?