c++ - 在类的最大实例化上引发错误

标签 c++ class error-handling instance throw

我希望我的程序在达到特定类(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);
}
如果超出限制,将导致程序崩溃的调试构建(快速失败),这在开发,测试和调试期间通常非常有用,但是如果成品中可以超过限制,则显然不应该使用它。 (由于断言通常会在发行版本中删除,因此不会引起注意,并且会导致任何问题或未定义的行为超出限制)。

关于c++ - 在类的最大实例化上引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65115466/

相关文章:

c++ - 如何循环绘制事物(FLTK/C++)?

excel - 错误编号未填充 'Excel Ran Out of Resources'错误

asp.net - 处理网页请求并发生500错误时,我应该重定向到错误页面吗?

c++ - 如何在 QLatin1String 中搜索子字符串?

c++ - 将文件读入缓冲区

node.js - 无法实例化扩展 EventEmitter 的导出自定义模块 Nodejs 的实例

class - puppet 节点类包含中继承的公认替代方案吗?

php - 如何将数组中的元素作为类添加

caching - React Native 缓存错误无法读取未定义的属性 getScrollableNode

c++ - 指向使用 Rcpp 对象创建的 C++ 类的指针