2015-07-14 6 views
5

Mi chiedevo se fosse considerato OK gettare eccezioni che sono definite nella libreria standard C++, invece di creare la mia classe. Per esempio, consideriamo la seguente funzione (stupido) che prende una stringa come argomento:È corretto lanciare eccezioni definite nella libreria standard C++?

#include <stdexcept> 
#include <iostream> 
#include <string> 

bool useless_function(const std::string& str) { 
    if (str == "true") 
     return true; 

    else if (str == "false") 
     return false; 

    else 
     throw std::invalid_argument("Expected argument of either true or false"); 
} 

e poi, naturalmente, si potrebbe fare qualcosa di simile:

int main(int argc, const char** argv) { 
    try { 
     const bool check = useless_function("not true"); 
    } 

    catch (std::invalid_argument& error) { 
     std::cerr << error.what() << '\n'; 
    } 

    return 0; 
} 

ho letto here che il std::stoi famiglia di funzioni genera un'eccezione std::invalid_exception quando riceve un argomento non valido; è da lì che è nata l'idea di cui sopra.

+0

C'è un'intera intestazione, "", con classi di eccezioni già pronte per l'uso, in modo che * non si spinga a inventare le proprie ruote. –

risposta

4

Sì, è perfettamente utile utilizzare classi di eccezioni standard per i propri scopi. Se si adattano bene alla tua situazione, vai avanti (ma non esitare a definire la tua classe quando/se nessuna classe standard si adatta bene).

Si noti inoltre che è possibile derivare dalle classi standard, quindi se si può aggiungere una precisione significativamente maggiore o un nuovo comportamento che non è presente nella classe standard, si può comunque voler usarlo come classe base.

La domanda migliore (IMO) sarebbe quando avrebbe senso definire le proprie classi di eccezioni (che non derivano almeno da quelle standard). Un candidato ovvio qui sarebbe se si desidera supportare qualcosa come un what() che restituisce una stringa in qualcosa come la codifica UTF-16 o UTF-32, quindi il "magazzino" "std :: exception" non fornirebbe molto (se) utilità, e sei praticamente bloccato dall'inizio ricominciare.

+0

Grazie! Non ero sicuro se le classi in "" dovessero essere utilizzate da un codice di libreria non standard. – ra1nmaster