抛出一个boost :: shared_ptr< customException>

时间:2011-03-07 16:59:05

标签: c++ exception-handling shared-ptr stack-unwinding

以下是否有任何陷阱;

 if (someCondition)
   throw boost::shared_ptr<SomeException>( new SomeException( "foo!" ) );

 ...

 catch( const boost::shared_ptr<SomeException>& expRef )
 {
 }

3 个答案:

答案 0 :(得分:6)

你应该避免使用指针投掷,而更喜欢throwing by valuecatching 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,然后销毁异常对象。否则运行时会直接销毁异常对象!你有什么收获?