Ultimamente ho convertito alcune librerie per utilizzare le strutture <system_error>
in C++ 11.Casi di utilizzo per std :: error_code
Ho difficoltà a comprendere gli use case per std::error_code
rispetto a std::error_condition
.
Nota, Capisco la differenza - ci sono many questions on stackoverflow che vanno oltre la differenza.
La differenza di base è che std::error_code
rappresenta un errore specifico di sistema o piattaforma, mentre std::error_condition
è un errore astratto che deve restituire un'interfaccia API o utente.
Ok, ma ho difficoltà a capire perché dovremmo usare mai lo std::error_code
nella pratica. Mi sembra che stai o sta per:
avere a che fare con un meccanismo specifico sistema di segnalazione degli errori (come dicono,
errno
o qualcosa restituito da una chiamata POSIX, o dire, una chiamata agetsockopt
conSO_ERROR
su Linux) che puoi facilmente convertire in unstd::error_condition
tramite le enumerazionistd::errc
, che dovrebbero essere portatili.utilizzeranno una categoria definita dall'utente degli errori, che rappresentano a livello di applicazione o di business-logic errori, come "numero di previdenza sociale valido" o qualunque - che pure sarebbe un caso d'uso per
std::error_condition
.Si tratta di un'interfaccia di basso livello o di una libreria che definisce il proprio meccanismo di segnalazione degli errori, come OpenSSL, nel qual caso si utilizzeranno direttamente meccanismi di errore specifici della piattaforma. In questo caso dovresti quindi convertire o mappare questi errori in un
std::error_code
. Ma se hai intenzione di passare attraverso la difficoltà di convertire questi errori specifici della piattaforma in qualcosa di generico comestd::error_code
, perché non convertirlo instd::error_condition
?
Inoltre, dal momento che gli errori di sistema POSIX dovrebbero essere portatile, e dal momento che mappa uno-a-uno con std::error_condition
tramite il std::errc
enum, non riesco a trovare alcun caso d'uso per std::error_code
. La maggior parte delle chiamate di sistema Linux/UNIX è impostata su errno
, che dovrebbe essere mappato in modo da portarlo su std::error_condition
.
Quindi, non vedo alcun caso di utilizzo per std::error_code
ovunque. Quindi, quali sono alcuni esempi di casi d'uso in cui vorremmo utilizzare std::error_code
anziché std::error_condition
?
Che dire [questo] (http://stackoverflow.com/a/16687434/560648) non è chiaro? –
@LightnessRacesinOrbit, l'idea è chiara, ma in pratica non vedo l'uso di 'error_code'. Il link che hai fornito dice: "Ogni oggetto' std :: error_code' contiene una coppia di codice di errore proveniente dal sistema operativo, o qualche interfaccia di basso livello "- okay, ma il sistema operativo ti darà un errore POSIX (che è portatile e può essere facilmente convertito in 'std :: error_condition') o qualche altro tipo di errore di basso livello (come ad esempio un errore Win32, per esempio), che dovresti quindi mappare manualmente a' std :: error_code' - ma a che serve mapparlo a error_code? ... – Siler
... se devi fare qualcosa di specifico della piattaforma, lavori direttamente con le strutture della piattaforma. Se hai bisogno di convertire l'errore in qualcosa di più generico, usi error_condition. Non vedo come error_code si adatta a tutto ciò. – Siler