Mặc dù câu hỏi này khá cũ và đã được trả lời nhiều, tôi chỉ muốn thêm một lưu ý về cách xử lý ngoại lệ thích hợp trong C ++ 11, vì tôi liên tục thiếu điều này trong các cuộc thảo luận về ngoại lệ:
Nó được mô tả trên StackOverflow ở đây và đây , cách bạn có thể lấy lại dấu vết về các ngoại lệ bên trong mã của mình mà không cần trình gỡ lỗi hoặc ghi nhật ký rườm rà, bằng cách viết một trình xử lý ngoại lệ thích hợp sẽ tạo lại các ngoại lệ lồng nhau.
Vì bạn có thể làm điều này với bất kỳ lớp ngoại lệ dẫn xuất nào, bạn có thể thêm nhiều thông tin vào một backtrace như vậy! Bạn cũng có thể xem qua MWE của tôi trên GitHub , nơi mà backtrace sẽ trông giống như sau:
Library API: Exception caught in function 'api_function'
Backtrace:
~/Git/mwe-cpp-exception/src/detail/Library.cpp:17 : library_function failed
~/Git/mwe-cpp-exception/src/detail/Library.cpp:13 : could not open file "nonexistent.txt"
Bạn thậm chí không cần phải phân lớp std::runtime_error
để có nhiều thông tin khi một ngoại lệ được đưa ra.
Lợi ích duy nhất mà tôi thấy trong phân lớp (thay vì chỉ sử dụng std::runtime_error
) là trình xử lý ngoại lệ của bạn có thể bắt ngoại lệ tùy chỉnh của bạn và làm điều gì đó đặc biệt. Ví dụ:
try
{
// something that may throw
}
catch( const MyException & ex )
{
// do something specialized with the
// additional info inside MyException
}
catch( const std::exception & ex )
{
std::cerr << ex.what() << std::endl;
}
catch( ... )
{
std::cerr << "unknown exception!" << std::endl;
}