3

私は に多くの異なるスレッド ( boost::thread_pool)を持っていboost::asio::io_serviceます。は、io_serviceをトリガーする関数を呼び出します。これはasync_read、さらに別の をトリガーし、async_readそこから多くの関数が呼び出される可能性があります。これはすべて 2 つのクラス内で行われます。スレッドはクラスから生成され、Serverクラスasync_readから呼び出されClientます。

(クラスから)throwによって呼び出された関数から私が提供された場合、誰が例外を取得しますか? ? もしそうなら、エラーを無視して通常の実行を再開する方法はありますか?async_readClientcatchServer

4

1 に答える 1

3

Boost.Asioマニュアルのこの部分は読みましたか?

概要: 「ハンドラーから例外がスローされた場合、例外は、スロー元スレッドの run()、run_one()、poll()、または poll_one() の呼び出しを通じて伝搬できます。これらの関数のいずれかを呼び出している他のスレッドはありません。影響を受けます。その場合、例外をキャッチするのはアプリケーションの責任です。」

したがって、それはあなたのcatch声明がどこにあるかによって異なります。

アップデート

例外が機能する一般的な方法は、エラーが発生すると、エラーを作成する関数が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
}
于 2012-05-05T07:55:13.620 に答える