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!
fonte
2011-09-30 22:17:25