#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;
}
Trong C++, khi truy xuất khóa không tồn tại của bản đồ, ngoại lệ trông giống như map::at: key not found
. Thông tin về khóa không được cung cấp.Tại sao ngoại lệ của C++ không cung cấp chi tiết cuộc gọi?
Ngoài ra, nếu một người đang truy cập tệp không tồn tại, thông báo ngoại lệ của std::ios_base::failure
trông giống như ios_base::clear: unspecified iostream_category error
. Tên tệp gây ra ngoại lệ không được cung cấp. Vì vậy, có thể mất khá nhiều thời gian để tìm ra nơi ngoại lệ là từ nếu có nhiều việc sử dụng map.at()
hoặc ifstream is
trong một dự án.
Ngược lại, Python có thể cho bạn biết KeyError: 'c'
hoặc FileNotFoundError: [Errno 2] No such file or directory: 'foo'
.
Đây có phải là quy ước C++ không? Cảm ơn bạn.
Hãy nhớ rằng, trong C++, chìa khóa của một bản đồ có thể không được chuyển đổi thành một chuỗi. – nos
Các C# FileNotFoundException cũng không đề cập đến tên tập tin của tập tin mà không thể được tìm thấy –
@ nos: theo tinh thần của stdlib bạn có lẽ nên nói "không có một op <<" nhưng thậm chí sau đó người ta có thể tranh luận rằng nó nên có thể làm điều này cho tất cả những loại mà nó có thể. Imho lý do chính là mạnh mẽ: những gì sẽ xảy ra nếu trong khi cố gắng để lắp ráp một thông báo lỗi đẹp và dandy, bạn gặp phải một ngoại lệ? – PlasmaHH