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_code
eerror_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
inerror_category
e come? - O come faccio a collegare
error_codes
al correttoerror_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?
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? –
È possibile creare un nuovo tipo di eccezione: si veda ad esempio 'std :: future_error' che è specifico per l'API dei futures. –
Grazie. Questo è un ottimo riferimento. Grazie anche per tutto il lavoro svolto su 'this :: thread',' boost :: thread' e 'std :: thread'. Sono pura vittoria. –