是否存在以下陷阱;
if (someCondition)
throw boost::shared_ptr<SomeException>( new SomeException( "foo!" ) );
...
catch( const boost::shared_ptr<SomeException>& expRef )
{
}
是否存在以下陷阱;
if (someCondition)
throw boost::shared_ptr<SomeException>( new SomeException( "foo!" ) );
...
catch( const boost::shared_ptr<SomeException>& expRef )
{
}
您应该避免通过指针抛出,而更喜欢按值抛出并通过 (const) 引用捕获。
使用智能指针是在使用指针时简化资源管理的一种方式,但如果您可以完全避免使用指针,这样做会更简单。只需抛出一个值。
是的,有一个陷阱。您将无法基于基类进行捕获:
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
}
你当然可以让它扔在基地上,但是你不能抓住派生的。
所以是的......不要这样做。
我能看到的唯一陷阱是,当您不必这样做时,您正在以艰难的方式做某事。:-)
通常,您使用 shared_pointer 来管理对象的生命周期,否则这并不明显。很明显,管理抛出的异常不是您的责任。编译器必须为你做这件事!
处理异常时,运行时将销毁 shared_pointer,然后将销毁异常对象。否则运行时会直接销毁异常对象!你有什么收获?