C++ 是否定义了标准库异常引发的消息?

C++ 是否定义了标准库异常引发的消息?,c++,exception,c++-standard-library,C++,Exception,C++ Standard Library,如果请求的值不在容器的范围内,std::vector::at将抛出一个std::out\u of \u range std::out\u of_range的构造函数需要一个字符串,捕获异常时可以通过.what()访问该字符串 但是我从来没有看到过任何关于这条信息中应该包含什么的文字。至少有两个原因有助于了解这一点: 我可能希望向用户显示此消息,例如在启用调试选项的情况下运行时。然后最好知道长度、语言、字符集等是否有任何限制 如果与标准容器足够相似,我可能希望在自己的类中使用std::out\u

如果请求的值不在容器的范围内,
std::vector::at
将抛出一个
std::out\u of \u range

std::out\u of_range
的构造函数需要一个字符串,捕获异常时可以通过
.what()
访问该字符串

但是我从来没有看到过任何关于这条信息中应该包含什么的文字。至少有两个原因有助于了解这一点:

  • 我可能希望向用户显示此消息,例如在启用调试选项的情况下运行时。然后最好知道长度、语言、字符集等是否有任何限制
  • 如果与标准容器足够相似,我可能希望在自己的类中使用
    std::out\u of_range
    ,并返回与标准库中使用的格式一致的消息
这在标准中有定义吗?如果没有,是否定义为未定义?

我通过n4659(早期的c++17草稿)进行了搜索

当标准库抛出时,根本没有对用于初始化这些异常的字符串的引用

我没有看到字符串可以打印的保证,尽管我怀疑在所有实现中它们都是:


除非您自己创建了异常文本,否则不应向用户显示异常文本。它几乎肯定不是英语ASCII以外的任何东西,但更重要的是,它在99%的情况下对用户都没有用处。您应该捕获异常并向用户显示一些实际有用的内容,例如“您的名字不适合我们80年代风格的数据库,因此我们为您对它进行了修改。您的名字现在是${name}。欢迎。”@JohnZwinck如果您可以将其作为答案,这样就可以添加适当的引用,并进行相应的投票,那就太好了。你似乎肯定知道这一点,但很多人“知道”的事情可能是真的,也可能不是真的。