在C++中正确使用例外
Proper use of exceptions in C++
C++我应该使用std::runtime_error
来指示发生了某种错误,还是应该创建从std::runtime_error
继承的自定义异常,以便更好地处理它们。
例如,如果我以某种方式从用户那里获得输入,哪个会更好:
if (inputInvalid)
{
throw std::runtime_error("Invalid input!");
}
对。。。
class invalid_input
: public std::runtime_error /* or should I inherit from std::exception? */
{
public:
invalid_input()
: std::runtime_error("Invalid input!")
{
};
};
-------------------------------------------------------
if (inputInvalid)
{
throw invalid_input();
}
哪个被认为是更好地使用异常处理/哪个是更好的做法?
我只会在以下两种情况下对标准异常类进行子类:
- 没有一个标准异常类具有描述异常性质的名称
- 我的异常需要比标准异常(即描述错误的字符串)中可以找到的信息更多的信息。
否则,没有多大意义。特别是如果其他人必须与您的代码交互并想知道为什么有一个自定义异常类不执行标准异常不执行的任何操作。
总是想想你从继承 std::runtime_error 中获得什么。它可以让您更轻松地处理错误吗?在示例代码中,它没有提供任何好处,因此如果它所做的只是同一件事,那么从 std::runtime_error 继承是没有意义的。如果要添加比 std::runtime_error 包含的信息更多的信息,则可能需要继承这些信息并将其添加到错误类中。
这将取决于项目的大小。如果你在做一些小事,只需要一些快速而肮脏的东西,std:runtime_error 很好。但是,如果您正在处理一个大项目,您将需要创建自己的自定义异常来帮助管理(通过捕获)所有不同的可能性。否则,现在如果你捕获了一个捕获,您将捕获所有内容,如果您需要以不同的方式捕获多个不同的东西来处理它们,这可能是一个问题。
我也会读到这个:
区别: 标准::runtime_error vs 标准::异常()
给出的示例中为您的invalid_input类子类 std::exception()。通常,用户输入错误不被视为运行时错误,您可能希望更早地捕获它,您可能希望在它发生时执行不同的逻辑。在这种情况下,在大多数情况下,从runtime_exception中使用或子类化无法通过"是"测试。
- 没有找到相关文章