std::system_error
处理带有相关错误代码的异常。是否可以使用常见的catch块来获取std :: system_error异常消息及其代码?喜欢这个
try{
// code generating exception
} catch (const std::exception& ex){ // catch all std::exception based exceptions
logger.log() << ex.what(); // get message and error code
// if exception type is system_error
}
唯一的方法是直接捕获std::system_error
类型并在基本异常类型捕获之前获取其代码吗?广泛使用std :: system_error的最佳方法是什么?
答案 0 :(得分:8)
广泛使用std :: system_error的最佳方法是什么?
我认为最好的方法是直接捕捉异常。
catch (const std::system_error& e) {
std::cout << e.what() << '\n';
std::cout << e.code() << '\n';
} catch (const std::exception& e) {
std::cout << e.what() << '\n';
}
唯一的方法是直接捕获std :: system_error类型并在基类异常类型捕获之前获取其代码吗?
从技术上讲,这不是唯一的方法。这是显而易见的惯用方式。您可以使用dynamic_cast
。
catch (const std::exception& e) {
std::cout << e.what() << '\n';
auto se = dynamic_cast<const std::system_error*>(&e);
if(se != nullptr)
std::cout << se->code() << '\n';
}
但是你在评论中提到你不想使用dynamic_cast
。也可以避免这种情况,但不能以任何方式有任何优势。
请注意,即使您可以以非显而易见的方式执行操作,也不代表您 。