gpt4 book ai didi

c++ - 使用 C++ 打开不存在的文件时未捕获到异常

转载 作者:可可西里 更新时间:2023-11-01 18:35:30 26 4
gpt4 key购买 nike

我从这里运行一个 MWE: http://www.cplusplus.com/reference/ios/ios/exceptions/在我的机器上它没有捕捉到异常。这是我的代码

#include <iostream>
#include <fstream>

int main()
{
std::ifstream file;
file.exceptions( std::ifstream::failbit | std::ifstream::badbit );
try
{
file.open("IDoNotExist.txt");
}
catch(const std::ifstream::failure& e)
{
std::cout << "Bad luck!" << std::endl;
}
}

在 Arch-Linux 上使用 gcc 6.2.1 我得到:

terminate called after throwing an instance of 'std::ios_base::failure'

what(): basic_ios::clear

但是,在上面发布的链接中提到代码还应该捕获与打开文件相关的异常。出了什么问题?

最佳答案

它看起来像一个 known bug in libstdc++ .

问题是,随着 C++11 ABI 的变化,libstdc++6.so 中的许多类被复制,一个版本使用旧 ABI,另一个版本使用新版本。

异常类没有重复,所以当时不存在这个问题。但是后来,在该语言的一些更新版本中,决定 std::ios_base::failure 应该派生自 std::system_error 而不是 std: :exception... 但是 system_error 是一个仅限 C++11 的类,因此它必须使用新的 ABI 标志,否则它会报错。现在你有两个不同的 std::ios_base::failure 类,你的手上一团糟!

简单的解决方案是使用 -D_GLIBCXX_USE_CXX11_ABI=0 编译您的程序,并重新使用旧的 ABI,直到错误被解决。或者,编写 catch (std::exception &e)

关于c++ - 使用 C++ 打开不存在的文件时未捕获到异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40246459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com