我浏览了http://en.cppreference.com/w/cpp/error/exception& http://en.cppreference.com/w/cpp/io/basic_fstream寻找我可能抛出的I / O异常。我知道我可以创建一个自定义异常类,并且有很多网站提供示例代码,但我想要一些专门针对最佳实践的指导。
另外,是否有一个我应该集中精力使用的图书馆让我的生活更轻松?
答案 0 :(得分:5)
C ++ 11为低级别错误引入了新标头system_error。可以编写自己的错误类别。
这可能是在现代C ++中编写自己的错误处理的良好起点。
答案 1 :(得分:4)
有很多predefined exceptions,但通常情况下,您要么定义自己的,要么将std::runtime_error
作为第一个近似值。
通常,您会扩展std::runtime_error
或std::exception
的其他衍生产品更合适。
例如,
class io_error : public std::runtime_error {
public:
using std::runtime_error::runtime_error;
};
答案 2 :(得分:4)
要回答问题的图书馆部分,请boost::exception
上的a look。
Boost异常可以从一个线程移动到另一个线程,并且您可以动态地将信息附加到异常 - 使用operator<<
- 当您捕获(并且可选地重新抛出)它时。此外,BOOST_THROW_EXCEPTION
宏会在表达式中记录文件,行和函数名称,以便进行漂亮的打印。
否则,通常的做法是为项目定义自己的例外。但由于我不熟悉你所说的“java like utility”,因此很难给出更具体的答案。
作为一个更一般的说明,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");