我还是初学者,我并没有真正掌握程序中异常的目的。
当你抛出异常时,你基本上会跳过你的程序中的(小或大)部分,所以我的一个问题是:如果异常导致程序结束?
另外,假设我们有一个Rectangle类。它将由它的长度和高度来定义:
utf8_bin
然而,具有负长度或高度没有多大意义。 那么我应该在构造函数中抛出异常吗?我应该使用任意约定并取其绝对值吗?我应该阻止main()中的用户传递否定参数吗?
答案 0 :(得分:1)
是的,在构造函数中,您没有任何其他选项来指示错误但是异常。如果您无法确保对象的有效状态,最好抛出一个。例如
#include <iostream>
#include <exception>
using namespace std;
struct Rectangle_exception : public std::runtime_error {
Rectangle_exception(const char* const message): std::runtime_error(message) {}
};
class Rectangle {
public:
Rectangle(double length, double height)
{
if (length > 0 && heigth > 0) {
length_ = length;
height_ = height;
}
else {
throw Rectangle_exception{"Invalid dimensions."};
}
}
// other methods
private:
double length_;
double height_;
};
有关异常的更多信息,请参阅此FAQ或“{3}}
的错误部分中的C ++中的错误处理”最佳做法“有时异常是不可取的(因为你的公司决定不使用它们),但你仍然希望有一些断言。 CppCoreGuiidelines建议使用名为Expects
和Ensures
的宏(并希望使用语言功能)。它计划在界面中声明前置条件和后置条件。现在,这些可能是具有不同行为的宏,具体取决于您的编译器标志。有关实施详情,请参阅CppCoreGuidelines或here
class Rectangle {
public:
Rectangle(double length, double height)
{
Expects(length > 0 && height > 0);
length_ = length;
height_ = height;
}
// other methods
private:
double length_;
double height_;
};