Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;捕获异常后执行清理的标准方法是什么?_C++_Exception - Fatal编程技术网

C++ C++;捕获异常后执行清理的标准方法是什么?

C++ C++;捕获异常后执行清理的标准方法是什么?,c++,exception,C++,Exception,假设我有一个从文件中读取的函数。读取文件时出错,我捕获到一个异常。例外并非致命的;我可以简单地要求用户输入正确的文件。但是为了询问用户这个问题,我可能必须退出抛出异常的函数。我在考虑简单地使用一个bool,如果一切顺利,它将返回true,如果出现问题,它将返回false。这是一种公认的做法,还是应该有一个标准 一个简单的尝试,用RAII来做 #include <iostream> #include <fstream> class FileReader{ std::

假设我有一个从文件中读取的函数。读取文件时出错,我捕获到一个异常。例外并非致命的;我可以简单地要求用户输入正确的文件。但是为了询问用户这个问题,我可能必须退出抛出异常的函数。我在考虑简单地使用一个
bool
,如果一切顺利,它将返回
true
,如果出现问题,它将返回
false
。这是一种公认的做法,还是应该有一个标准

一个简单的尝试,用RAII来做

#include <iostream>
#include <fstream>
class FileReader{
    std::ifstream file_descriptor;
public:
    FileReader();
    ~FileReader();
    void readFromFile();
};

FileReader::FileReader() :
        file_descriptor(std::ifstream("test.txt",std::ifstream::in)) {

}

FileReader::~FileReader() {
    file_descriptor.close();
}

void FileReader::readFromFile() {
    std::string line;
    while (std::getline(file_descriptor, line)){ //this can then be in a try block in case file reading goes wrong
        std::cout << line << std::endl;
    }
}

int main() {
    FileReader fileReader;
    fileReader.readFromFile();
    std::cout << "Hello, World!" << std::endl;
    return 0;
}
#包括
#包括
类文件读取器{
std::ifstream文件\ u描述符;
公众:
文件阅读器();
~FileReader();
void readFromFile();
};
FileReader::FileReader():
文件描述符(std::ifstream(“test.txt”,std::ifstream::in)){
}
FileReader::~FileReader(){
文件_描述符.close();
}
void FileReader::readFromFile(){
std::字符串行;
而(std::getline(file_descriptor,line)){//这可以在try块中,以防文件读取出错
标准::cout
捕获异常后执行清理的标准方法是什么

惯用的方法是在析构函数中进行清理


例如,如果打开一个文件,将接收一个文件描述符(整数值),您应该在构造函数中打开,在成员变量中存储描述符,并在析构函数中进行清理,包括关闭文件。这种模式就是RAII习惯用法。

使用RAII。不要过早捕获异常;只捕获必须执行操作的位置。这将是一个意见问题。没有任何方法可以解决dle这个和异常可能不是您想要使用的。异常应该是在异常情况下使用的,错误的文件名不是例外,用户经常输入错误的信息。@RichardCriten我不太确定如何在这种情况下应用RAII。您是说我应该允许在错误状态下读取文件,然后当我不这样做时若要使用资源,则抛出异常?RAII可能直接应用于文件本身,也可能不直接应用于文件本身,但在解析文件时创建的任何对象都应在出现故障时正确处理,RAII通常是处理该问题的最简单方法。“…读取文件时出错…”:我认为这意味着该文件已成功打开,但在读取/解析其内容时出现问题(可能在几次读取之后)。RAII用于文件对象和任何其他需要清理的资源,如缓冲区。在阅读您的评论后,我已使用代码示例编辑了我的原始问题。如果您有时间,我非常希望您对此进行输入