4

在C++中的我应该用std::runtime_error来表示某种错误发生,或者我应该创建一个从std::runtime_error继承,所以我可以更好地处理这些自定义异常。恰当使用C++异常

例如,如果我从不知何故用户的输入,这将是更好:

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(); 
} 

这被认为是更好的使用异常处理/如果这更好的实践?

+0

后者将使捕获这种特定类型的运行时错误成为可能,而第一种只允许您捕获'a'运行时错误。哪个更好取决于你打算如何处理错误。 – wroniasty 2012-04-26 15:39:03

+0

这是一个非常敏感的话题,每个人都有不同的意见。只要看看'Go'式的方法('throw'终止任务,所以不需要有明显的类型)与'Java'方法及其非常复杂的层次结构。 – 2012-04-26 15:39:54

回答

6

我只能继承一个标准的异常类在两种情况之一:

  1. 标准异常类都没有描述我的异常的性质名
  2. 我例外,需要比什么都可以附加信息在标准异常中找到(即描述错误的字符串)。

否则,没有多少意义。特别是如果其他人将不得不与你的代码进行交互,并想知道为什么有一个自定义的异常类没有做任何事情,一个标准的异常不会做。

1

总是想着从继承std :: runtime_error中获得什么。它是否让您更轻松地处理错误?在示例代码中,它没有给出任何好处,所以如果它从一个方面继承std :: runtime_error,那么没有任何意义。如果你想添加比std :: runtime_error更多的信息,那么你可能想要继承并将它们添加到你的错误类中。

1

这将取决于项目的规模。如果你在小事上工作,只需要快速和肮脏的东西,std:runtime_error就没问题。但是,如果你在一个大项目上工作,你将要创建自己的自定义例外,以帮助管理(通过捕获)所有不同的可能性。否则,现在如果你做了一个捕获,你会捕获一切,如果你需要以不同的方式捕捉多个不同的东西来处理它们,这可能是一个问题。

我也会这样说的:

Difference: std::runtime_error vs std::exception()

0

我将继承的std ::例外()在你给的例子你INVALID_INPUT类。通常情况下,用户输入错误不被视为运行时错误,您可能希望尽早捕获它,您可能希望在发生时执行不同的逻辑。在这种情况下,从runtime_exception中使用或继承大多数情况下会失败“是”测试。