我可以拥有异常的静态全局实例吗?

时间:2016-02-01 01:55:56

标签: c++ c++11 exception static global-variables

我在一些地方读过,提出例外情况可能很昂贵。我有一个例外,我希望以某种频率发生,我每次都会抓住它。这可能是一个天真的问题(像许多人一样,我在例外游戏中迟到了):

我可以创建我的异常的静态全局实例,并在它出现时(仅从一个方法)创建它throw,每次捕获它吗?

这会在任何时候拯救我吗?或者因为我希望以某种频率抛出,只会从这一个方法抛出此异常(此刻),并且将始终捕获此异常,这是否表示我应该使用其他范例来处理这种情况? / p>

感谢您提供任何有用的答案!

2 个答案:

答案 0 :(得分:4)

异常是按值抛出的,而不是通过引用抛出的,因此只需拥有一个异常类的实例,就无济于事。

然而,有一个的可能性 rethrow_exception(它需要exception_ptr作为参数)可能更有效,在某些给定系统上有一些给定的编译器和选项。您必须衡量才能确定这一点。

值得注意的是,对于大多数(所有?)C ++实现,异常机制针对极少抛出异常的代码进行了优化。因此,让执行通过try块等大多是免费的,免费的。但投掷的动作可能代价高昂。所以,是的,如果可以的话,不管任务是什么,都要考虑其他“范式”。例如,你可以返回一个 1 boost::optional<T>,它就像一个包含一个对象或没有任何东西的盒子。

1 如果你想避免对Boost的依赖,那么POD类型的Optional类实现起来很简单,对于非POD,可以使用{{1}作为对象载体,以可能的动态分配为代价。 功能

答案 1 :(得分:3)

首先回答你的真实问题:

  

我可以创建一个异常的静态全局实例,并在它出现时抛出它(仅从一个方法),每次捕获它吗?

没有。抛出的异常对象总是新构造的,每次都是唯一的对象。此外,异常对象的构造并不昂贵,特殊的控制流程也是如此。但

  

或者因为我希望以某种频率抛出,只会从这一个方法抛出此异常(此刻),并且将始终捕获此异常,这是一个标志,我应该使用其他范例来处理这个情况?

是的,当然。例外情况是出现异常错误,而不是您希望发生的错误。返回一些状态代码或状态,如标准流听起来更合适。