在 class 的最大实例化上抛出错误

Throw error on max instantiations of class

我希望我的程序在达到某个 class (MAX) 的定义的最大对象数时抛出错误。我必须限制实例化的数量,因为我正在使用提供有限资源的框架。

目前我有以下(简体):

class Resource {
    private:
    static int count;

    public:
    Resource();
};

int Resource::count = 0;

Resource::Resource() {
    if (++count > MAX) {
        throw std::domain_error("Cannot create more resources.");
    }
}

是否推荐使用 std::domain_error 还是我应该使用其他类型?还是我根本不应该抛出错误并采用不同的方法?

我会回答一般性问题,不考虑申请的任何细节。

Is the use of std::domain_error recommended or should I use another type? Or should I not throw an error at all and follow a different approach?

关于抛出哪个异常:std::domain_error 特别与函数的参数超出允许范围有关,所以这不太合适。正如@NathanOliver 所建议的那样, std::runtime_error 将是一个不错的选择。或者从中派生的自定义异常。

关于抛出异常或使用不同的方法:一个重要的问题是何时错误预计会发生以及谁可以处理它.

异常通常用于正常操作期间可能发生的错误,最好在 运行 时处理。

如果分配的资源量是在开发过程中确定的,而过多的资源分配表明存在错误,则可以选择断言:

Resource::Resource() {
    assert(++count <= MAX);
}

如果超过限制,这将使程序的调试构建崩溃(快速失败),这在开发、测试和调试期间通常非常有用,但如果可以限制,则显然不应使用成品中超标。 (由于断言通常在发布版本中被删除,因此它会被忽视并导致超出限制的任何问题或未定义行为)。