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 に答える