为ifstream::failure和ofstream::failure异常引发错误C2312



我正在编写一个修改文本文件的小型应用程序。它首先创建文件的副本,以防出现问题。

以下函数在同一目录中创建此副本。它将文件名作为参数,如果成功创建副本,则返回true,如果失败,则返回false。

#include <iostream>
#include <filesystem>
#include <fstream>
#include <string>
using std::ifstream;
using std::ofstream;
using std::string;
using std::cerr;
using std::cin;
using std::cout;
using std::endl;
bool backupFile(string FileName) {
cout << "Creating backup for " << FileName << "..." << endl;
try { // for debugging purposes
string NewName = "bkp_" + FileName;
string CurLine;
ifstream FileCopy(FileName);
ofstream FileBackup(NewName);
if (FileCopy.fail()) { // Could specify how file copy failed?
cerr << "Error opening file " << FileName << ".";
return false;
}

while (getline(FileCopy, CurLine)) { // Copy lines to new file
//cout << "Copying " << CurLine << "" to " << NewName << "." << endl;
FileBackup << CurLine << "n";
}     

cout << "File successfully backed up to " << NewName << endl;
return true;
}
catch (const ifstream::failure& iE) {
cerr << "Exception thrown opening original file: " << iE.what() << endl;
return false;
}
catch (const ofstream::failure& oE) {
cerr << "Exception thrown outputting copy: " << oE.what() << endl;
}
catch (...) {
cerr << "Unknown exception thrown copying file." << endl;
return false;
}
}

我使用了一些catch语句来指示输入(ifstream::failure(、输出(ofstream::failure(是否存在问题,或者两者都不存在。

然而,在编译过程中,会出现以下错误:

error C2312: 'const std::ios_base::failure &': is caught by 'const std::ios_base::failure &' on line 42

对我来说,这个错误意味着ifstream::failure和ofstream::failure都被捕捉到了,这似乎很奇怪。当我移除对stream::failure的捕获时,它运行良好。

为什么会出现这种情况?

ifstream::failureofstream::failure都是在std::ios_base基类std::ios_base::failure中定义的同一类型,在两个单独的catch子句中不能捕获同一类型。

请注意,两个流实际上都不会抛出任何异常,默认情况下std::fstream不会抛出任何例外。您必须通过调用exceptions:来打开异常

FileCopy.exceptions(f.failbit);
FileBackup.exceptions(f.failbit);

当流进入失败状态时,上述情况将导致抛出std::ios_base::failure。由于您已经在检查FileCopy.fail(),您可以将该检查扩展到其他故障情况(例如,检查FileCopygetline期间没有故障,FileBackup也没有故障(,而不是启用异常。

最新更新