2009-03-25 18 views
21

In Java se un argomento di input per un metodo non è valido, è possibile generare uno IllegalArgumentException (che è di tipo RuntimeException). In C++, non vi è alcuna nozione di eccezioni controllate e non controllate. Esiste un'eccezione simile nello standard C++ che può essere utilizzata per indicare un'eccezione di runtime? O c'è uno stile comune non nello standard ma tutti seguono in pratica una situazione come questa?Equivalente di IllegalArgumentException di Java in C++

Oppure, dovrei semplicemente creare la mia eccezione personalizzata e lanciarla?

risposta

39

A differenza di Java, C++ non ha un "framework standard" ma solo una piccola (e facoltativa) libreria standard. Inoltre, i programmatori C++ hanno opinioni diverse sull'uso delle eccezioni su tutto il.

Pertanto, troverete diverse raccomandazioni da persone diverse: ad alcuni piace usare i tipi di eccezioni dalla libreria standard, alcune librerie (ad esempio Poco) usano una gerarchia di eccezioni personalizzate (derivata da std :: exception), e altre no utilizzare le eccezioni (es. Qt).

Se si desidera attenersi alla libreria standard, esiste un tipo di eccezione specializzato: invalid_argument (estensione logic_error).

#include <stdexcept> 

// ... 
throw std::invalid_argument("..."); 

per il riferimento: Ecco una panoramica dei tipi di eccezione standard definite (e documentati) in stdexcept:

exception 
    logic_error 
     domain_error 
     invalid_argument 
     length_error 
     out_of_range 
    runtime_error 
     range_error 
     overflow_error 
     underflow_error 
2

std :: domain_error potrebbe essere quello che stai cercando, ma ho il sospetto che poche persone lo usino. La maggior parte delle persone ricava i propri tipi di eccezione da std :: exception.

1

Se da non valida si intende non valori metodo previsto soddisfatti si può buttare

std::logic_error 
or 
std::runtime_error. 

Se vuoi dire qualcosa legato alla getta come un oggetto non può essere convertito in un altro - non esiste alcuna eccezione per quella e non verrà gettato automaticamente.

Infatti lo farà. Ma solo per dynamic_cast <> sui riferimenti. si getterà

std::bad_cast 

non sono sicuro che sia una buona idea di lanciare questo da soli.

Preferisco utilizzare logic_error e le sue derivate nel caso in cui qualcuno abbia trasmesso un parametro errato perché si tratta di un errore logico: il programmatore ha passato un tipo di argomento errato.

Ma più di tutto mi piace usare affermare in questi casi. Poiché cose come il passaggio di valori o tipi errati alla propria funzione possono essere accettabili solo durante lo sviluppo e tali controlli dovrebbero essere evitati nel rilascio.

+0

Il dynamic_cast <>() con un tipo di riferimento genera un'eccezione standard? –

+0

Sì, un'eccezione std :: bad_cast. Se è con riferimenti. Con i puntatori viene restituito uno 0 e il codice utente deve controllare il valore del risultato. –

+0

Sì, std :: bad_cast. –

2

Uso sempre std::invalid_argument per argomenti non validi.

1

si può buttare un'eccezione standard o rotolare il proprio. Potresti voler includere informazioni aggiuntive nell'eccezione che stai lanciando, e questa sarebbe una buona ragione per farne una tua.

Personalmente, non ho visto tale controllo del dominio nei sistemi su cui ho lavorato. Certamente non è universale.