Durante la progettazione della mia prima libreria C ++ "seria", mi chiedo:
È buono lo stile da cui derivano le eccezioni std::exception
ed i suoi discendenti ?!
Anche dopo aver letto
- Progettazione di classi di eccezione
- Qual è un "buon numero" di eccezioni da implementare per la mia biblioteca?
Non ne sono ancora sicuro. Perché, oltre alla pratica comune (ma forse non buona), suppongo, come utente di una biblioteca, che una funzione di biblioteca lancerebbe std::exception
s solo quando le funzioni di biblioteca standard falliscono nell'implementazione della biblioteca e non può farci nulla. Ma ancora, quando scrivo il codice dell'applicazione, per me è molto conveniente, e anche IMHO bello guardare semplicemente a std::runtime_error
. Anche i miei utenti possono fare affidamento sull'interfaccia minima definita, come what()
o codici.
E ad esempio, il mio utente fornisce argomenti errati, cosa sarebbe più conveniente che lanciare un std::invalid_argument
, non è vero? Quindi, combinato con l'uso ancora comune di std :: exception, vedo nel codice di altri: perché non andare oltre e derivare dalla tua classe di eccezione personalizzata (ad esempio lib_foo_exception) e anche da std::exception
.
Pensieri?
lib_foo_exception
classe deriva std::exception
, l'utente della biblioteca avrebbe catturato lib_foo_exception
solo catturando std::exception
, oltre a quando cattura solo quello libario. Quindi potrei anche chiedere Se la mia classe root delle eccezioni della libreria eredita da std :: exception .
lib_foo_exception
?" Con l'ereditarietà std::exception
puoi farlo da catch(std::exception)
OR da catch(lib_foo_exception)
. Senza derivarne std::exception
, lo prenderesti se e solo se , da catch(lib_foo_exception)
.
catch(...)
. È lì perché il linguaggio consente il caso che stai prendendo in considerazione (e per le librerie "comportamentali male"), ma non è la migliore pratica moderna.
catch
siti più grossolani, più generali e allo stesso modo transazioni più grossolane che modellano un'operazione di fine utente. Se lo confronti con le lingue che non promuovono l'idea di catture generalizzate std::exception&
, ad esempio, spesso hanno molto più codice con try/catch
blocchi intermedi interessati da errori molto specifici, il che riduce in qualche modo la generalità della gestione delle eccezioni quando inizia a posizionarsi un'enfasi molto più forte sulla gestione manuale degli errori e anche su tutti gli errori disparati che potrebbero verificarsi.
std::exception
non significa che passi astd::exception
. Inoltre,std::runtime_error
ereditastd::exception
in primo luogo, e ilwhat()
metodo vienestd::exception
, nonstd::runtime_error
. E dovresti assolutamente creare le tue classi di eccezioni invece di generare eccezioni generiche comestd::runtime_error
.