-6

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

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

4

3 回答 3

5

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

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

于 2013-03-14T15:52:22.033 回答
4

有很多预定义的异常,但通常,您要么定义自己的异常,要么将 throwstd::runtime_error作为第一个近似值。

通常,您会扩展std::runtime_error,或者它的另一个派生词std::exception更合适。

例如,

class io_error : public std::runtime_error {
public:
    using std::runtime_error::runtime_error;
};
于 2013-03-14T15:51:58.167 回答
4

要回答问题的库部分,请查看.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");
于 2013-03-14T16:00:47.543 回答