1

是否存在以下陷阱;

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

 ...

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

3 回答 3

6

您应该避免通过指针抛出,而更喜欢按值抛出通过 (const) 引用捕获

使用智能指针是在使用指针时简化资源管理的一种方式,但如果您可以完全避免使用指针,这样做会更简单。只需抛出一个值。

于 2011-03-07T17:04:37.787 回答
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
}

你当然可以让它扔在基地上,但是你不能抓住派生的。

所以是的......不要这样做。

于 2011-03-07T17:33:59.697 回答
1

我能看到的唯一陷阱是,当您不必这样做时,您正在以艰难的方式做某事。:-)

通常,您使用 shared_pointer 来管理对象的生命周期,否则这并不明显。很明显,管理抛出的异常不是您的责任。编译器必须为你做这件事!

处理异常时,运行时将销毁 shared_pointer,然后将销毁异常对象。否则运行时会直接销毁异常对象!你有什么收获?

于 2011-03-07T17:32:59.570 回答