我浏览了http://en.cppreference.com/w/cpp/error/exception和http://en.cppreference.com/w/cpp/io/basic_fstream寻找我可能抛出的 I/O 异常。我知道我可以创建一个自定义异常类,并且有很多网站提供示例代码,但我想要一些专门针对最佳实践的指导。
另外,有没有我应该集中精力使用的图书馆来让我的生活更轻松?
我浏览了http://en.cppreference.com/w/cpp/error/exception和http://en.cppreference.com/w/cpp/io/basic_fstream寻找我可能抛出的 I/O 异常。我知道我可以创建一个自定义异常类,并且有很多网站提供示例代码,但我想要一些专门针对最佳实践的指导。
另外,有没有我应该集中精力使用的图书馆来让我的生活更轻松?
C++11为低级错误引入了新的头文件system_error 。可以编写自己的错误类别。
这可能是在现代 C++ 中编写自己的错误处理的良好起点。
有很多预定义的异常,但通常,您要么定义自己的异常,要么将 throwstd::runtime_error
作为第一个近似值。
通常,您会扩展std::runtime_error
,或者它的另一个派生词std::exception
更合适。
例如,
class io_error : public std::runtime_error {
public:
using std::runtime_error::runtime_error;
};
要回答问题的库部分,请查看.boost::exception
Boost 异常可以在线程之间移动,并且您可以在operator<<
捕获(并可选地重新抛出)异常时动态地将信息附加到异常。此外,BOOST_THROW_EXCEPTION
宏会在您的表达式中记录文件、行和函数名称以进行漂亮的打印。
否则,通常的做法是为您的项目定义自己的例外。但是很难给出更具体的答案,因为我不熟悉您所说的“类似 java 的实用程序”。
作为更一般的说明,C++ 设计原则之一就是做你所要求的,仅此而已,这在某些情况下是一种祝福,在某些情况下意味着更多的工作——这与 java 完全不同。异常的主要目标是用throw
/中断正常的程序流catch
,而 C++ 就是这样做的。
如果您只想要一个简单的字符串消息:
struct E: std::exception {
const char* msg;
E(const char* msg_): msg(msg_) {}
const char* what() const { return msg; }
};
// ...
throw E("invalid operation name");