2012-02-10 7 views
11

私はboost::asio::deadline_timerにバインドされたコールバック関数を持っています。この関数は、タイマーがキャンセルされたとき、またはタイマーが時間切れになると呼び出されます。この2つのケースを区別する必要があるので、渡されたエラーコードを確認する必要があります。基本的なコードは次のようになります:ブーストエラーコードを適切にカウントクックするには?

void CameraCommand::handleTimeout(const boost::system::error_code& error) 
{ 
    std::cout << "\nError: " << error.message() << "\n"; 
    return; 
} 

今、タイマーがエラーコードを経過したため、ハンドラが呼び出されたときに、タイマは、エラーコードがOperation canceledでキャンセルされた場合、Successです。

私の質問は、どのように起こったのかを適切にチェックする方法でしょうか?

提案1:

if(error.message() == "Success") 
{ 
    // Timer expired 
} 
else 
{ 
    // Timer cancelled 
} 

提言2:

if(error.value() == 0) 
{ 
    // Timer expired 
} 
else 
{ 
    // Timer cancelled 
} 

今私の質問です - byitselfない値または文字列でエラーを比較する方法はありますか?ような何か(これは今まで行われているが)

if (error == boost::system::error::types::success) 

私は最初の提案については好きではない、私はちょうど私の意見ではちょっと不要ですチェックのための文字列を作成する必要があるということですので。 2番目の方法は、私が他の何かをチェックしたい場合、すべてのエラーコードを調べる必要があるという欠点がありますか? エラーを確認する列挙型や方法はありますか、または2つの方法のいずれかがありますか?

あなただけのブールキャストを使用することができます

答えて

18

documentationを見ると、あなたが列挙値を使用することができます。

switch(error.value()) 
{ 
    case boost::system::errc::success: 
    { 
    } 
    break; 

    case boost::system::errc::operation_canceled: 
    { 
     // Timer cancelled 
    } 
    break; 

    default: 
    { 
     // Assert unexpected case 
    } 
    break; 
} 
+0

素晴らしい - 私が探していたもの!ありがとうございました!!! – Toby

+0

うん、これは間違っているかもしれない。これは、error_codesとerror_conditionsを比較する必要があり、比較のためにvalue()を使用しないでください。 http://blog.think-async.com/2010/04/system-error-support-in-c0x-part-2.html –

+0

これは間違っています。 boost error_codeにはカテゴリと値があります。同じ値が複数のカテゴリに存在する可能性があります。両方を確認する必要があります。 –

9

if (error) 
{ 
    // Timer has been cancelled - or some other error. If you just want information 
    // about the error then you can output the message() of the error. 
} 
else 
{ 
    ... 
} 

boost::error_codeは、このためにブール演算子を持って、ここを見て:http://www.boost.org/doc/libs/1_48_0/libs/system/doc/reference.html#Class-error_code

+0

これはキャンセルされたか、期限切れか、if(!error)の意味を特定して特定のエラーをチェックする方法を決定したいので、この特定の問題に適していますか? – Toby

+0

BOOSTの各部分には独自のエラーコードが設定されています。 http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/reference/error__basic_errors.html – Nick

+0

IMHO 'if(error.value()!= boost :: system :: errc ::)成功)はより正確で読みやすく、**ブール演算子のオーバーライド実装**に依存しないため、インプリメンテーションではなくインターフェイスにプログラムされます。 –

2

デフォルトのエラーコードを使用することができます。