关于例外使用的问题

时间:2016-03-26 18:41:05

标签: c++11 exception-handling

我还是初学者,我并没有真正掌握程序中异常的目的。

当你抛出异常时,你基本上会跳过你的程序中的(小或大)部分,所以我的一个问题是:如果异常导致程序结束?

另外,假设我们有一个Rectangle类。它将由它的长度和高度来定义:

utf8_bin

然而,具有负长度或高度没有多大意义。 那么我应该在构造函数中抛出异常吗?我应该使用任意约定并取其绝对值吗?我应该阻止main()中的用户传递否定参数吗?

1 个答案:

答案 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建议使用名为ExpectsEnsures的宏(并希望使用语言功能)。它计划在界面中声明前置条件和后置条件。现在,这些可能是具有不同行为的宏,具体取决于您的编译器标志。有关实施详情,请参阅CppCoreGuidelineshere

class Rectangle {
public:
    Rectangle(double length, double height)
    {
        Expects(length > 0 && height > 0);
        length_ = length;
        height_ = height;
    }
    // other methods
private:
    double length_;
    double height_;
};