为什么std::stof、std::stod和std::stold使用异常处理错误?

6
什么是 std::stofstd::stodstd::stold 抛出异常的原因?

http://en.cppreference.com/w/cpp/string/basic_string/stof

输入错误是异常处理不适用的常见例子(通常以“异常情况”的古怪循环推理方式表达,但仍然是一个很好的例子)。并不是其他错误处理机制在C++标准库中被禁止使用。例如,另一个C++11的新手,std::unordered_map::insert家族,使用std::pair<iterator,bool>返回类型的第二个元素指示失败。在std::unordered_map::insert函数内部失败似乎比输入错误更加“异常”。尝试插入之前,可以保证插入成功,但是没有解析就无法保证解析成功。

我只是想知道当时这些函数被接受为标准时的原因。希望它已经发布在某个地方或者委员会成员可以过来解释一下。我不是要求关于异常与其他机制的优缺点的全面论述。


很明显,保持C++标准库的传统不好解析......例如,考虑strto*的签名,如果您要在手写递归下降解析器中使用这些函数之一,您必须在调用它之前复制剩余的输入。或者考虑流输入的差劲组合性。因此,对于良好的解析,您有两个选择,自己编写或使用第三方库rsp.解析器生成器。 - Arne Vogel
1个回答

7
原始论文N1803: Simple Numeric Access使用异常。然而该论文并未解释他们的设计来自哪里(比如为什么他们完全忽略了分配器!)。之后对它的修订(N1982N2408)也没有说明为什么要抛出异常。如果有其他记录超出这些论文,我不知道。

然而,我可以猜测。我们可以看到,论文的第一个草案就抛出异常。而且似乎从来没有争议过。这可能源于异常是在C++中指示操作失败的标准方法,特别是在C++标准库中。

一些标准库类型具有其他错误机制(iostreams)。但总的来说,异常是默认情况。


我相信返回一对值的插入函数不会覆盖具有相同键的现有元素。它们只是返回一个迭代器,以便您可以选择是否要进行覆盖。因此,在某种意义上,如果没有插入任何内容,该函数在这种情况下确实是不成功的。如果这是在标准库之外,我会说名称“insert”选择得很糟糕。然而,考虑到标准库中“简短”优于“描述性”的明显偏好,我理解为什么他们坚持只使用“insert”。 - Paul Groke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接