C++ 为什么std::ifstream即使特别启用了异常,也不会引发异常?
因此,默认情况下,当您打开无效的文件路径时,C++ 为什么std::ifstream即使特别启用了异常,也不会引发异常?,c++,gcc,ifstream,C++,Gcc,Ifstream,因此,默认情况下,当您打开无效的文件路径时,std::ifstream不会引发异常。它会悄无声息地失败,如果不使用fail()方法或类似的方法来检查,它很容易被忽略,这是非常糟糕的 由于我希望获得任何类型故障的异常,以便能够自动通知我,因此我尝试使用建议的exceptions()方法: 令我惊讶的是,如果文件路径不存在,这个仍然不会引发异常。我尝试改用std::ios::badbit,但结果相同 我在Ubuntu上用GCC进行了测试 为什么不能按预期工作?出现故障时,open()设置failbi
std::ifstream
不会引发异常。它会悄无声息地失败,如果不使用fail()
方法或类似的方法来检查,它很容易被忽略,这是非常糟糕的
由于我希望获得任何类型故障的异常,以便能够自动通知我,因此我尝试使用建议的exceptions()
方法:
令我惊讶的是,如果文件路径不存在,这个仍然不会引发异常。我尝试改用std::ios::badbit
,但结果相同
我在Ubuntu
上用GCC
进行了测试
为什么不能按预期工作?出现故障时,
open()
设置failbit
,而不是badbit
。您不是要求ifstream
在failbit
上抛出异常,而是在发生故障时,open()
设置failbit
,而不是badbit
。您没有要求ifstream
在failbit
上抛出异常。请再看一看。Re:“这很糟糕”--它不会自动失败。您可以检查它是否成功。任何输入操作也会失败。你不能盲目地尝试一堆输入而不检查它是否成功。许多程序员成功地编写了复杂的程序,在I/O失败时不需要异常。@PeteBecker:当然,但是当我们有异常时,检查返回值是一种非常过时和麻烦的编程方式。再看看.Re:“这很糟糕”--它不会默默地失败。您可以检查它是否成功。任何输入操作也会失败。你不能盲目地尝试一堆输入而不检查它是否成功。很多程序员成功地编写了复杂的程序,在I/O失败时不需要异常。@PeteBecker:当然可以,但是当我们有异常时,检查返回值是一种非常过时和麻烦的编程方式。
std::ifstream input_stream;
input_stream.exceptions(std::ifstream::badbit);
input_stream.open(file_path);