如何处理抛出异常的文件析构函数?

Ste*_*eel 4 c++

关闭正在写入的文件时检测错误很重要,因为数据的最后一部分可能在关闭期间被刷新,如果丢失则最后一次写入失败,有人应该知道它.文件对象的析构函数是一个自动关闭它的好地方,但人们说不要从析构函数中抛出异常,所以如果关闭失败那么你怎么知道呢?

我听说有人建议手动调用文件的close()方法.这听起来不错,除非在这种情况下多个文件的close()方法都失败了会发生什么:

    MyFile x(0), y(1), z(2);
    x.close();
    y.close();
    z.close();
Run Code Online (Sandbox Code Playgroud)

好吧,似乎如果'x'的close()方法抛出异常,那么你已经做好了维护规则以避免在'x'的析构函数中抛出异常,除非现在你是善意的早期调用到'y'和'z'的close()方法直到它们的析构函数才会执行.那么,当在'y'的析构函数中调用'y'的close()方法或在'z'的析构函数中调用'z'的close()方法时,如果它们确实抛出异常,那么你'搞砸了.

有没有合理的方法可以在这种情况下搞砸?

Jar*_*Par 5

是的,捕获析构函数中关闭抛出的异常.

C++析构函数不会抛出异常期是非常重要的.否则将破坏几乎每个可用库中的许多资源管理例程.

没错,在这种情况下,通过捕获异常会丢失失败信息.如果用户实际关注错误,他们可以手动调用close并处理异常.