2012-02-10 17 views
11

Bir boost::asio::deadline_timer bağlı bir geri arama fonksiyonu var. Şimdi, zamanlayıcı iptal edildiğinde veya sona erdiğinde işlev çağrılır. Bu iki durum arasında ayrım yapmam gerektiğinden, geçirilen Hata kodunu kontrol etmem gerekiyor. Temel kodu şöyle olacaktır: Zamanlayıcı hata kodu iptal edilir zamanlayıcı hata kodu Success olduğunu sona erdiğinden Handler denir ŞimdiYükseltme Hatası Kodunun uygun bir şekilde nasıl onaylanması gerekir?

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

, Operation canceled olduğunu.

Şimdi benim sorum olacaktı, ne kadar uygun olanları kontrol etmek için?

Öneri 1:

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

Öneri 2:

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

Şimdi sorum şu - byitself değere göre değil, veya dize hatayı karşılaştırmak için herhangi bir yolu var mı? Böyle bir şey (bu şimdi oluşur)

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

ne ilk öneri hakkında sevmiyorum ben sadece Bence tür gereksiz çek, bir dize oluşturmak gerektiğini çünkü. İkinci yol dezavantajı varsa, başka bir şeyi kontrol etmek istersem, tüm hata kodlarını aramam gerekecek mi? Yani herhangi çeteleler veya yolları hata olup olmadığını kontrol etmek vardır yoksa iki kişiden biri yollarını tavsiye do?

cevap

18

documentation baktığımızda:

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 bunun için boole bir operatör var, burada bir göz var

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

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

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

Harika - tam olarak aradığım şey! Teşekkür ederim!!! – Toby

+0

Hmm, yanlış anlayabilirim. Bu hata_kodları error_conditions ile karşılaştırmalı ve karşılaştırmalar için value() kullanmamamızı söylüyor. http://blog.think-async.com/2010/04/system-error-support-in-c0x-part-2.html –

+0

Bu yanlıştır. boost error_code kategorileri ve değerleri vardır. Aynı değer birden fazla kategoride bulunabilir. İkisini de kontrol etmelisin. –

9

sadece bir boolean döküm kullanabilirsiniz: enum değerleri kullanabilirsiniz, http://www.boost.org/doc/libs/1_48_0/libs/system/doc/reference.html#Class-error_code

+0

, bu, bu sorun için uygun olacağını 'if (! Hatası)', ama nasıl bir hata nedeniyle kontrol edilir? – Toby

+0

Dikkat edilmesi gereken tek şey, BOOST'un her bölümünün kendi hata kodları kümesine sahip olmasıdır. dışarı http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/reference/error__basic_errors.html edin – Nick

+0

IMHO 'if (error.value()! = boost :: sistemi :: ERRC'nin :: başarı) 'daha hassas, daha okunabilir ve ** boolean operatörüne bağlı değildir, ** uygulamayı geçersiz kılar ve bu nedenle bir uygulama değil, bir arayüze programlanır. –

2

yapabilirsiniz varsayılan inşa ERROR_CODE kullanın:

Sadece iptal edilip edilmediğini belirlemek istiyorum ya da sadece ne anlama gelir, dolmuş beri Tamam
if(error == boost::system::error_code()) 
İlgili konular