c ++ std :: exception ...我可以请更多吗?

时间:2013-03-14 15:46:01

标签: c++ exception exception-handling c++11 fstream

我浏览了http://en.cppreference.com/w/cpp/error/exception& http://en.cppreference.com/w/cpp/io/basic_fstream寻找我可能抛出的I / O异常。我知道我可以创建一个自定义异常类,并且有很多网站提供示例代码,但我想要一些专门针对最佳实践的指导。

另外,是否有一个我应该集中精力使用的图书馆让我的生活更轻松?

3 个答案:

答案 0 :(得分:5)

C ++ 11为低级别错误引入了新标头system_error。可以编写自己的错误类别。

这可能是在现代C ++中编写自己的错误处理的良好起点。

答案 1 :(得分:4)

有很多predefined exceptions,但通常情况下,您要么定义自己的,要么将std::runtime_error作为第一个近似值。

通常,您会扩展std::runtime_errorstd::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");