2

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

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

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");
}

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

4

3 回答 3

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阅读内容的更多信息。

于 2012-04-10T10:37:47.843 回答
2

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

于 2012-04-10T11:15:08.867 回答
1

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

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

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

关于重新投掷

于 2012-04-10T10:31:02.320 回答