2012-04-10 41 views
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"); 
} 

質問:私たちは、configファイルにリストされているファイルがで見つからないときので、これを防ぐにはどうすればよい ディレクトリ、アプリケーションはそれを無視し、プロセスを続行するでしょうか?

答えて

1

最も簡単なのは、スレッド内で独自の例外を試してみると、であることを確認してください。それを無視するには例外です。他の例外であれば再実行してください。

スローされた例外やレガシーコードに情報を追加することが可能かどうかはわかりませんが、後者の場合、文字列の比較に頼らざるを得ませんが、もちろん醜いです。とにかく。

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

On Rethrowing

2

私はstd::asyncを使用することをお勧めします。機能がスローされた場合、std::asyncで実行された場合、例外はstd::futureに保存されます。私はあなたがstd::future::get()に電話するときには転校されるでしょう。しかし、あなたがそれをしないと、それはちょうど "無視される"ので、あなたはアプリケーションを実行し続けるでしょう。

例:std::async詳細については

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

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

thisをお読みください。

+0

これはC++ 0xにのみ適用できますか? – Owen

+0

@Owenはい。あなたが 'C++ 11 'を使うことができないならば、boostもおそらく動作します。 – inf

2

最も簡単な方法は、ファイルを処理するコードのブロックを囲むようにtry/catchステートメントを置くことです。 他の特殊なケースで例外が発生する可能性が高いため(たとえば、読んでいる間に消えたネットワークファイルを読むときなど)、他の例外のコードを慎重にチェックしてください。

関連する問題