gpt4 book ai didi

c++ - 为什么 C++ 的异常不提供调用细节?

转载 作者:IT老高 更新时间:2023-10-28 22:16:38 24 4
gpt4 key购买 nike

#include <fstream>
#include <iostream>
#include <map>

int main(int argc, char** argv) {
try {
std::map<std::string, int> m{{"a", 1}, {"b", 2}};
std::cout << m.at("c") << std::endl;
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
}

return 0;
}

在 C++ 中,当检索不存在的映射键时,异常看起来像 map::at: key not found .没有提供关于 key 的信息。

另外,如果访问一个不存在的文件,std::ios_base::failure 的异常消息看起来像 ios_base::clear: unspecified iostream_category error .未提供导致异常的文件名。因此,如果有很多 map.at(),可能需要很长时间才能找出异常的来源。或 ifstream is在项目中使用。

与此相反,Python 可能会告诉你 KeyError: 'c'FileNotFoundError: [Errno 2] No such file or directory: 'foo' .

这只是一个 C++ 约定吗?谢谢。

最佳答案

问题在于 C++ 对象模型,它与 Python 的不同。相比之下,首先让我们回答:Python 在异常对象中存储什么来打印 key ?它是一个使该对象保持事件状态的引用。

这不能简单地在 C++ 中完成。

  1. std::out_of_range 无法按原样存储对 key 的指针或引用。异常的处理程序可能在很远的 block 中。这意味着在输入处理程序之前, key 很可能超出范围。如果引用了键,我们会得到未定义的行为。

  2. std::out_of_range 是一个具体的类。不是像 std::map 这样的模板。它不能轻易地将 key 复制到自身中。 Key 类型有很多种,显然不能全部解释。即使可以,如果复制 key 非常昂贵怎么办?甚至根本不可复制?即使在不正确​​的情况下,如果 key 不能转换为字符串或可打印怎么办?

以上几点并不意味着不可能。 std::map::at 可以抛出 std::out_of_range 的子类,它会进行类型删除等等。但我希望你看到它有不平凡的开销。 C++ 就是不为您不需要或使用的功能支付性能费用。让每个人无条件地承担这个开销,不符合这个设计。

关于c++ - 为什么 C++ 的异常不提供调用细节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47988193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com