2011-05-09 22 views
12

cerco di capire come il nuovo system_error insieme error_code, error_category e non ultimo il (lo scopo di implementare portatile segnalazione di errori) error_condition dovrebbe essere usato.Implementazione di un buon C++ 0x error_condition?

Penso leggendo boost.system Capisco come dovrei usare error_codes e error_category. La descrizione lascia fuori come questa viene usata insieme quando si lancia un'eccezione con 'system_error`, ma dall'interfaccia di quella classe posso indovinare.

class system_error : public runtime_error { 
public: 
    // [...] 
    system_error(error_code ec, const string& what_arg); 
    system_error(int ev, const error_category& ecat, const string& what_arg); 
    system_error(int ev, const error_category& ecat); 
    // [...] 

Così, butto un -exception system_error con il diritto int + error_category o error_code con la sua error_category() -Metodo.

Ma qual è il modo di fornire l'interfaccia portatile con error_condition?

Sia error_codeeerror_category entrambi hanno metodo default_error_condition:

class error_category { 
public: 
    // [...] 
    virtual error_condition default_error_condition(int ev) const noexcept; 
    // [...] 

class error_code { 
public: 
    // [...] 
    error_condition default_error_condition(int ev) const noexcept; 
    // [...] 

deve essere pre-creati i error_category -Instances, per esempio (user-code):

struct AppCategory : public error_category { 
    const char *name() const noexcept override { 
    return "application"; } 
    string message(int ev) const override { 
    switch(ev) { 
     case 14: return "error message"; 
     default: return "???"; 
    } 
    } 
    error_condition default_error_condition(int ev) const noexcept override { 
    ... ??? ... 
    } 
}; 

Le mie domande per implementare questo:

  • Devo implementare default_error_condition in error_category e come?
  • O come faccio a collegare error_codes al corretto error_conditions,
  • e dovrei pre-costruire error_condition casi?
  • Una classe error_code non dovrebbe essere fornita dall'utente (me), giusto?

C'è un buon esempio in cui posso dare un'occhiata a come il codice error_condition dovrebbe essere esteso dall'utente, in collaborazione con system_error -exceptions?

risposta

5

Se i codici di errore per la vostra categoria di errore possono essere mappati ad uno dei codici di errore std::errc poi default_error_condition dovrebbe fare che la mappatura, e restituire un std::error_condition con una categoria di std::generic_category() e un valore del valore std::errc enum corrispondente. Altrimenti dovrebbe restituire un error_condition riferito a quella categoria.

+0

Se ho un set di condizioni di errore dalla mia applicazione multipiattaforma, come dovrebbero essere lanciati? Dalla documentazione sembra strano metterli in un 'system_error' in quanto porta un' error_code 'dipendente dalla piattaforma. Ad esempio, ho un 'enum' che è specificato come' is_error_condition_enum' e ho un 'error_category' che corrisponde a quelle condizioni di errore. Devo creare un'eccezione che presenti un 'error_condition' in questo caso? –

+1

È possibile creare un nuovo tipo di eccezione: si veda ad esempio 'std :: future_error' che è specifico per l'API dei futures. –

+0

Grazie. Questo è un ottimo riferimento. Grazie anche per tutto il lavoro svolto su 'this :: thread',' boost :: thread' e 'std :: thread'. Sono pura vittoria. –