【发布时间】:2018-08-11 08:33:36
【问题描述】:
在类中抛出异常时,程序员的工作是确保该异常在类中被捕获吗?还是假设此异常将在主文件/运行程序中捕获是最佳实践?我相信是后者,但我有点不确定....采取以下代码:
#include <stdexcept>
#include <iostream>
using namespace std; // supposedly trustworthy duck
class Duck
{
public:
Duck(int quack_nominee);
private:
int quack_strength;
};
Duck::Duck(int quack_nominee)
{
if (quack_nominee < 0)
{
throw runtime_error("A quack having a negative value produces undefined behavior on reality.");
}
quack_strength = quack_nominee;
}
上面的代码是好的做法吗?我假设抛出的 runtime_error 会在某处被捕获。如果使用我的类的程序员没有实现 try-catch 块,.exe 文件将崩溃(至少在我的 IDE 和编译器上)。
另外,如果我应该在类本身中有一个 try-catch 块,是否可以合法地实现它?
【问题讨论】:
-
您的“错误”称为异常。
-
如果可以处理异常,就应该捕获它。如果无法处理异常,则不应捕获它(除非它被捕获、记录并重新抛出)。考虑一个例外,相当于“弃船!”。
-
哦,差点忘了:什么异常不应该用于非异常情况的流控制。
-
此外,对于此特定代码,使用
unsigned参数或只是将其未定义(通常不推荐,仅出于效率目的)是替代方法,具体取决于您的意图。 -
在这种情况下
std::invalid_argument可能是一个更合适的例外:“报告由于参数值未被接受而出现的错误”。与std::runtime_error相反:“报告由于超出程序范围的事件而导致的错误,并且无法轻易预测”.
标签: c++ class c++11 error-handling try-catch