抓住一个开放的例外

时间:2014-06-04 17:47:34

标签: c++ exception io

我有这段代码,只是想知道为什么它不会抛出异常(或者在这种情况下它应该这样做)。

来自cplusplus.com

  

如果函数无法打开文件,则会为流设置failbit状态标志(如果使用成员例外注册了状态标志,则可能会抛出ios_base :: failure)。

#include <fstream>
#include <exception>
#include <iostream>

int main() {
  std::ofstream fs;

  try {
    fs.open("/non-existing-root-file");
  } catch (const std::ios_base::failure& e) {
    std::cout << e.what() << std::endl;
  }

  if (fs.is_open())
   std::cout << "is open" << std::endl;
  else
   std::cout << "is not open" << std::endl;

   return 0;
 }

3 个答案:

答案 0 :(得分:3)

你没有遵循兔子追踪all of the way down
您需要使用std::ios::exceptions告诉它您想要例外。如果不这样做,它会通过failbit状态标志指示失败。

// ios::exceptions
#include <iostream>     // std::cerr
#include <fstream>      // std::ifstream

int main () {
  std::ifstream file;
  ///next line tells the ifstream to throw on fail
  file.exceptions ( std::ifstream::failbit | std::ifstream::badbit );
  try {
    file.open ("test.txt");
    while (!file.eof()) file.get();
    file.close();
  }
  catch (std::ifstream::failure e) {
    std::cerr << "Exception opening/reading/closing file\n";
  }

  return 0;
}

答案 1 :(得分:0)

我不认为fstream会因打开文件失败而抛出异常。你必须用bool fstream :: is_open()检查它。

答案 2 :(得分:0)

您需要使用failbit注册std::ios::exceptions()标记才能投掷,但您还没有完成。