2012-05-05 5 views
3

boost::asio::io_serviceには多くの異なるスレッド(boost::thread_pool)があります。 io_serviceは、async_readをトリガーする関数を呼び出します。async_readは、これから多くの関数が呼び出される可能性があります。これは、2つのクラス内で行われます。スレッドはServerクラスから生成され、async_readClientクラスから呼び出されます。ブースト、例外、スレッド、および非同期、どのようにそれらを処理する必要がありますか?

async_readClientクラスから)によって呼び出される関数からI throwが提供された場合、誰がcatchに例外を受け取るのですか? Server?もしそうなら、エラーを無視して定期的な実行を再開する方法はありますか?

答えて

3

Boost.Asio manualのこの部分は読んでいますか?

概要:例外がハンドラからスローされた場合 」、例外が()、run_one()、ポール()またはpoll_one()の実行の投擲スレッドの呼び出しを介して伝播することが許されていない他のスレッド。 例外をキャッチするのはアプリケーションの責任です。 "

だから、あなたのcatchステートメントがある場所によって異なります。

UPDATE

例外が動作することを一般的な方法は、エラー時にエラーを作成する機能が例外をthrowということです。すべての呼び出し関数は、呼び出すワーカー関数tryとエラーを解決するための例外catchを持つ必要があります。オプションで、捕捉された例外(またはその他の例外)をチェーンの上位にあるすべての呼び出し関数に再スローすることができます。

void some_function() 
{ 
    // do some work 

    if (error_occurred) 
     // don't know context, so pass the buck to calling function 
     throw std::exception; 
} 

void some_calling_function() 
{ 
    try { 
     some_function(); // could throw 
    } catch (std::exception& e) { 
     // do some error handling depending in context 
    } 
    // code will resume here 
} 
+2

このリンクで見つけることができる内容の要約、またはOPの問題を解決したコード例を追加してください:私はこのページを保存し、オフラインでそれを読めば、あなたの答えは何も価値がない:X –

+0

@ MatthieuM。要約はOKですが、OPからのコードはなく、問題を解決するコードをどのように提供できますか? – TemplateRex

+0

これは一般的なガイドラインなので、答えを更新する時間をとってくれた*または* :) +1です。 –

関連する問題