2011-09-30 4 views

risposta

5

Devi creare codice di errore e categoria per creare l'oggetto error_code. Ecco un esempio, assumendo che l'errore è dovuto a un altro rifiuto connessione host:

error_code ec (errc::connection_refused, system_category()); 
return ec; 

È possibile anche passare errno valore come il codice di errore quando si utilizza il sistema categoria. Per esempio:

#include <fstream> 
#include <cerrno> 
#include <boost/system/system_error.hpp> 

void foo() 
{ 
    ifstream file ("test.txt"); 
    if (!file.is_open()) 
    { 
     int err_code = errno; 
     boost::system::error_code ec (err_code 
      , boost::system::system_category()); 
     throw boost::system::system_error (ec, "cannot open file"); 
    } 
} 

Purtroppo, questa libreria è scarsamente documented, quindi si può consigliare di guardare in header files per capire le cose. Il codice è abbastanza semplice e diretto lì.

Nel caso in cui il compilatore supporti C++ 11 e si desideri utilizzarlo, questa funzionalità lo ha reso standard. Per quanto ne so già gcc 4.6.1. Ecco un semplice esempio:

#include <cerrno> 
#include <system_error> 

std::error_code 
SystemError::getLastError() 
{ 
    int err_code = errno; 
    return std::error_code (err_code, std::system_category()); 
} 

void foo() 
{ 
    throw std::system_error (getLastError(), "something went wrong"); 
} 

In generale, le biblioteche passano error_code oggetto intorno se non v'è alcuna necessità di lanciare e utilizzare system_error un'eccezione che descrive errori di sistema. Un altro motivo per utilizzare error_code senza eccezioni è quando è necessario segnalare l'errore tra thread diversi. Ma C++ 11 ha a solution for propagating exceptions across threads.

Spero che aiuti!