MST
星途 面试题库

面试题:C++文件自动打开关闭的异常处理

假设你使用RAII机制实现文件的自动打开与关闭,当文件打开失败时(例如文件不存在、权限不足等情况),如何在不破坏RAII原则的前提下,合理地处理异常并向调用者反馈错误信息?请给出详细代码实现和异常处理策略说明。
39.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

异常处理策略说明

  1. RAII原则:RAII(Resource Acquisition Is Initialization)即资源获取即初始化,在对象构造时获取资源,在对象析构时释放资源。
  2. 异常处理:当文件打开失败时,抛出异常。调用者可以捕获这个异常并处理错误信息。这样既保证了资源在对象析构时正确释放,又不破坏RAII原则。

代码实现

#include <iostream>
#include <fstream>
#include <stdexcept>

class FileRAII {
public:
    FileRAII(const std::string& filename) : file(filename) {
        if (!file.is_open()) {
            throw std::runtime_error("Failed to open file: " + filename);
        }
    }

    ~FileRAII() {
        if (file.is_open()) {
            file.close();
        }
    }

    std::ifstream& getFile() {
        return file;
    }

private:
    std::ifstream file;
};

int main() {
    try {
        FileRAII file("nonexistent_file.txt");
        std::ifstream& f = file.getFile();
        // 进行文件操作
    } catch (const std::runtime_error& e) {
        std::cerr << "Error: " << e.what() << std::endl;
    }
    return 0;
}

在上述代码中:

  1. FileRAII类的构造函数尝试打开文件,如果打开失败,抛出std::runtime_error异常,包含失败的文件名信息。
  2. 析构函数负责关闭文件,保证资源的正确释放。
  3. main函数中,使用try - catch块捕获异常,并输出错误信息。这样在文件打开失败时,能合理处理异常并向调用者反馈错误,同时遵循RAII原则。