4

この質問は OpenKinect Libraries に限定されたものではありませんが、これは私がこれを誇示するために思いついた最良の例です。

OpenKinect の C++ ラッパーでは、何か問題が発生するたびに、runtime_error 例外がスローされます。この例は、libfreenect.hpp からのものです。スレッドは、クラスのコンストラクターで作成されます。

// Do not call directly, thread runs here
void operator()() {
    while(!m_stop) {
        if(freenect_process_events(m_ctx) < 0) throw std::runtime_error("Cannot process freenect events");
    }
}

static void *pthread_callback(void *user_data) {
    Freenect* freenect = static_cast<Freenect*>(user_data);
    (*freenect)();
    return NULL;
}

私の質問は単純です: これらのエラーを何らかの方法でキャッチして処理することは可能ですか?

通常、私は例外を処理するか、コードを書き直します。例外が原因でプログラムがクラッシュするのは好きではありません。例外が発生する可能性があることがわかっている場合は、クリーンに処理したいと思います。私が書き直すことができない同様のことを行うライブラリがいくつかあるため、なぜこの質問をするようになったのですか。

4

1 に答える 1

0

スレッドの責任をより明確に定義する必要があります。ある種のパイプまたは同時キューを介して、いくつかのメッセージを他のスレッドにフィードしていると思います。その場合は、メッセージ クラスを変更して、例外情報 (std::exception_ptr) を格納するだけです。メッセージ内のデータにアクセスするときは、最初に例外が含まれているかどうかを確認してください。その場合は、std::rethrow_exception() を呼び出します。

同様のメカニズムが std::future() で使用されます。そこから約束された値を get() するか、そうしようとしているときに例外が発生し、それが他のスレッドから発生します。std::async() の例を検索して、実際の動作を確認してください。

于 2013-03-20T22:14:13.850 に答える