2011-05-09 8 views
12

próbuję dowiedzieć się, w jaki sposób nowa system_error wraz z error_code, error_category a nie najmniej (przeznaczona do wdrożenia przenośny błąd raportowanie) error_condition powinny być stosowane.Implementacja dobrego C++ 0x error_condition?

Myślę, że czytając boost.system Rozumiem, jak powinienem używać error_codes i error_category. W opisie pominięto sposób, w jaki jest on używany w połączeniu z wyrzucaniem wyjątku z atrybutem system_error`, ale z interfejsu tej klasy mogę zgadnąć.

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); 
    // [...] 

Więc rzucam system_error -exception z prawem int + error_category lub error_code z error_category() -method.

Ale co ten sposób, aby zapewnić interfejs przenośny z error_condition?

Zarówno error_codeierror_category zarówno method 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; 
    // [...] 

W error_category -Instances powinny być wstępnie utworzone, na przykład (użytkownika kodu)

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 { 
    ... ??? ... 
    } 
}; 

Moje pytania dotyczące tego:

  • Czy powinienem wdrożyć default_error_condition w error_category i jak?
  • lub w jaki sposób mogę podłączyć error_codes do prawidłowego error_conditions,
  • i mam wstępnie skonstruować error_condition instancji?
  • Klasa użytkownika error_code nie powinna być dostarczana przez użytkownika (mnie), prawda?

Czy jest dobrym przykładem, gdzie można zapoznać się z kodem jak error_condition ma być przedłużony przez użytkownika, w połączeniu z system_error -exceptions?

Odpowiedz

5

Jeśli kody błędów dla danej kategorii błędu mogą być przypisane do jednego z std::errc kodów błędów następnie default_error_condition powinien zrobić to mapowanie i zwraca std::error_condition z kategorii std::generic_category() i wartości odpowiadającej wartości std::errc enum. W przeciwnym razie powinien zwrócić wartość error_condition odnoszącą się do tej kategorii.

+0

Jeśli mam zestaw warunków błędu z mojej aplikacji obsługującej wiele platform, w jaki sposób należy je zgłaszać? Z dokumentacji wydaje się dziwne umieszczenie ich w 'system_error', ponieważ powoduje, że platforma jest zależna od' error_code'. Na przykład mam 'wyliczenie', które jest określone jako' is_error_condition_enum' i mam 'error_category', która pasuje do tych warunków błędu. Czy w tym przypadku muszę utworzyć wyjątek, który niesie "error_condition"? –

+1

Można utworzyć nowy typ wyjątku: patrz na przykład 'std :: future_error', który jest specyficzny dla interfejsu API Futures. –

+0

Dzięki. To świetne odniesienie. Dziękuję również za całą pracę wykonaną na 'this :: thread',' boost :: thread' oraz 'std :: thread'. Są czystą wygraną. –