如何在没有取消的情况下处理线程中的文件打开错误?

时间:2012-04-10 10:27:23

标签: c++ multithreading fopen

我有一个服务应用程序,它读取包含要打开的文件列表的配置文件。问题是当它在目录中找不到该文件时,它会抛出异常,从而取消该线程并停止服务应用程序。

这是在线程中调用的函数的代码块:

FILE* file_;
ServiceApp::File::File( const char* filename, const char* mode) :
file_(fopen(filename, mode))
{
    if( !file_ )
    {
    // throwing will stop the service when file doesn't exist, what work around could we do?
    throw std::runtime_error("file open failure");
}

问题: 我们如何防止这种情况发生,以便在目录中找不到配置文件中列出的文件时,应用程序会忽略它并继续该过程?

3 个答案:

答案 0 :(得分:2)

我建议使用std::async。如果函数抛出通过std::async运行的函数,则异常将保存在std::future中。当你致电std::future::get()时,我会被重新开始。但是,如果您不这样做,它将被“忽略”,因此您的应用程序将继续运行。

示例:

auto lambda = [] {
    throw std::runtime_error("error");
};

auto handle = std::async(std::launch::async, lambda);

有关std::async的更多信息,请阅读this

答案 1 :(得分:2)

最简单的方法是将try / catch语句放在处理文件的代码块周围。 您很可能在其他特殊情况下遇到其他异常情况(例如,在阅读阅读期间消失的网络文件时),因此请仔细检查代码以了解其他异常

答案 2 :(得分:1)

最简单的方法是在线程中尝试捕获自己的异常,然后检查它是那个异常(忽略它),如果是其他异常则重新抛出。

我不确定是否可以将信息添加到抛出的异常或遗留代码中?在后一种情况下,你将不得不求助于字符串比较,这当然是丑陋的。反正。

// pseudo-code
while(GotFilesInQueue())
{
  try
  {
    LoadNextFile();
  }
  catch(std::exception& e)
  {
    if(!IgnoreExceptionPredicate(e))
    {
      throw;
    }
  }
}

On Rethrowing