在命名空间实现中抛出catch

时间:2015-11-29 01:39:36

标签: c++ namespaces try-catch division throw

问题已删除:钝。给出的答案过于尖锐或者没有当场点击这种迟钝的质疑。

1 个答案:

答案 0 :(得分:0)

在C ++中使用异常时的黄金法则是“按值抛出,通过const引用捕获”。

quotient()中,当您说

throw new string("divide by zero!");

你正在堆上创建一个新的字符串,如果发生异常,它永远不会被释放。相反,你应该说

throw string("divide by zero!");

将堆叠 - 分配新的字符串。

稍后,当你在catch块中时,你应该通过const引用来捕获,即

catch (const string& str) {
    // ...
}

其原因主要是技术性的:const引用可以绑定到rvalue而可变引用不能绑定,并且按值捕获可能需要字符串的副本。

或许或者以另一种方式看待它:例外的目的是传达某些事情失败的原因。这个原因一旦发生就不会改变,所以在创建之后应该将异常视为const