2011-03-07 35 views
1

是否存在以下任何缺陷;抛出一个boost :: shared_ptr <customException>

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

... 

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

除了这是不寻常的事实吗?你为什么要抛出'shared_ptr'? –

+1

除了你使代码复杂化之外,使用一个性能较差的构造(动态分配)来实现一些可以写得更简单,性能更好的东西......我想不出任何其他的陷阱。 –

+0

投掷shared_ptr可以在异步边界上传播异常,而无需切片或不必在异常类上实现克隆。 –

回答

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 
} 

你当然可以让它扔在基地,但你无法赶上的。

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

6

你应该避免指针投掷和喜欢throwing by valuecatching by (const) reference

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

+0

+1,这和Crazy Eddie的答案一样好。我选择他的原因是1)我没有想过他之前说过什么,而我意识到你提到的事实2)你每个问题只能有一个正确答案 – lurscher

1

我能看到的唯一缺陷就是当你不需要的时候,你正在做一些艰难的事情。 :-)

通常情况下,您使用shared_pointer来管理对象的生命周期,否则这种情况并不明显。这里很明显,它不是你的责任来管理抛出的异常。编译器将不得不为你做!

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

相关问题