我在一些地方读过,提出例外情况可能很昂贵。我有一个例外,我希望以某种频率发生,我每次都会抓住它。这可能是一个天真的问题(像许多人一样,我在例外游戏中迟到了):
我可以创建我的异常的静态全局实例,并在它出现时(仅从一个方法)创建它throw
,每次捕获它吗?
这会在任何时候拯救我吗?或者因为我希望以某种频率抛出,只会从这一个方法抛出此异常(此刻),并且将始终捕获此异常,这是否表示我应该使用其他范例来处理这种情况? / p>
感谢您提供任何有用的答案!
答案 0 :(得分:4)
异常是按值抛出的,而不是通过引用抛出的,因此只需拥有一个异常类的实例,就无济于事。
然而,有一个的可能性 rethrow_exception
(它需要exception_ptr
作为参数)可能更有效,在某些给定系统上有一些给定的编译器和选项。您必须衡量才能确定这一点。
值得注意的是,对于大多数(所有?)C ++实现,异常机制针对极少抛出异常的代码进行了优化。因此,让执行通过try
块等大多是免费的,免费的。但投掷的动作可能代价高昂。所以,是的,如果可以的话,不管任务是什么,都要考虑其他“范式”。例如,你可以返回一个 1 boost::optional<T>
,它就像一个包含一个对象或没有任何东西的盒子。
1 如果你想避免对Boost的依赖,那么POD类型的Optional
类实现起来很简单,对于非POD,可以使用{{1}作为对象载体,以可能的动态分配为代价。
功能
答案 1 :(得分:3)
首先回答你的真实问题:
我可以创建一个异常的静态全局实例,并在它出现时抛出它(仅从一个方法),每次捕获它吗?
没有。抛出的异常对象总是新构造的,每次都是唯一的对象。此外,异常对象的构造并不昂贵,特殊的控制流程也是如此。但
或者因为我希望以某种频率抛出,只会从这一个方法抛出此异常(此刻),并且将始终捕获此异常,这是一个标志,我应该使用其他范例来处理这个情况?
是的,当然。例外情况是出现异常错误,而不是您希望发生的错误。返回一些状态代码或状态,如标准流听起来更合适。