我正在编写一个小型库,当输入参数超出范围时,它会执行一些可能引发异常的事情。我会抛出一个 std::out_of_range 似乎很简单。
我还想生成一个很好的消息,例如“你给了我 X,但 Y 是范围内的最大值” - 即我正在格式化一个字符串并希望将它用于异常。
奇怪的是构造函数的签名是
explicit out_of_range (const string& what_arg)
也就是说,它需要对字符串的 const 引用。当我们从函数中弹出时,我在堆栈上创建的任何字符串都将被销毁,为异常捕获器留下一堆乱七八糟的垃圾。所以我只有几个选择:
- 使用字符串文字,因此不会生成好的消息。它在程序的生命周期内有效。
- 在函数中将字符串设为静态,并在抛出时重写。线程安全对我的程序来说不是问题,但这感觉很脏。
- 子类 out_of_range 以便它获取字符串的副本,并使用对副本的引用调用超类构造函数,以便副本在异常对象的生命周期内存在。
我倾向于 3 作为最不严重的,并且可以说是比直接使用标准类更好的设计,但我不得不问:真的没有办法直接使用标准的 out_of_range 类和生成的字符串吗?我错过了什么吗?