是否有可能做RAII没有例外
Is it possible to do RAII without exceptions?
如果在对象的构造中需要获得的资源可能失败,如果局部编码标准禁止异常,那么可能做RAII吗?
如果是,在这种情况下,处理资源获取失败的规范方式是什么?
我一般不会使用无效对象方法,因为我认为这是糟糕的设计。在构造之后,对象必须处于建立不变量的状态(这是构造函数应该服务的唯一目的)。考虑一个类strange_vector
实现了类似于std::vector
的东西,但是在调用strange_vector<int>(10, 0)
之后,由于分配失败,该对象将处于不可用状态。
class file
{
public:
~file() {fclose(m_file);}
static std::optional<file> open(std::string const& filename)
{
auto f = fopen(filename.c_str(), "r");
if (f)
{
return std::make_optional<file>(f);
}
else
{
return std::nullopt;
}
}
private:
file(FILE* file);
FILE* m_file;
};
异常处理的最大好处之一是(除了解耦错误处理和正常代码路径之外)您不会意外地忽略它们。如果需要这样做,您可以创建自己的类,类似于optional
,当没有使用有效对象初始化时,记录错误消息并终止程序(或任何其他合理的错误处理)。我想a . Alexandrescu有一个关于系统错误处理的演讲,他实现了一个类Expected<T>
,其中包含T
类型的值或异常。你可以使用这个基,而不是在那里添加错误处理。 std::optional
还不是标准的一部分,但是您可以很容易地从最近的编译器、boost或其他库中获得实现。
您总是可以创建一个bool valid(void)
方法。然后,构造函数可以设置适当的条件,在代码中,您可以在构造之后检查这是否有效。
class foo
{
public:
foo(const char *Filename)
{
mValid = false;
if(fopen(Filename) == NULL)
return;
mValid = true;
}
bool valid(void) { return mValid; }
private:
bool mValid;
};
void myfunc(void)
{
foo fl("myfile");
if(!fl.valid())
{
printf("Errorn");
return;
}
}
相关文章:
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 有可能使shared_ptr协变吗
- 有可能在信号处理程序中设置promise吗
- 是否有可能实现O(N)时间和O(1)空间解决方案,以实现C++中的字符串循环移位
- 是否有可能构建面向Linux和Windows的.Net Core C++ / CLI应用程序?
- 是否有可能使用debug_info获取ELF文件的源代码?
- C++,是否有可能/如何定义在.h和.cpp源文件中调用函数的类构造函数
- 有可能在C++中有类的查找表吗
- 是否有可能让 c++ dll 在后台运行 python 程序并让它填充向量图?如果是这样,如何?
- 向量的大小是否有可能为 1 但其中的元素数量为零?
- 是否有可能编写新的叮当声现代化规则?
- 是否有可能通过指向另一个未关联的子对象的指针来获取指向一个子对象的指针?
- 是否有可能通过演绎指南实现整个 std::make_tuple 功能?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 是否有可能具有放入容器的移动操作的类型?
- 是否有可能通过溢出 C 中的第一个元素来写入数组第二个元素
- 声明是否有可能逃脱其封闭的名称空间
- git-是否有互联网上某处所有可能错误的列表
- 是否有可能做RAII没有例外