Qual è il modo migliore per gestire eccezioni leggermente diverse?

0

Il mio codice ora assomiglia a qualcosa del tipo:

void throw_illegal_part_of_input_exception(char c) {}
void throw_invalid_input_length_exception(int position, int length) {}
void throw_invalid_subinput_length_exception(int position, int length, bool is_greater) {}
// Some other similar functions

// ... do some stuff inside a function
if (errorCondition1) {
    throw_invalid_character_exception(c);
} else if (errorCondition2) {
    throw_invalid_input_length_exception(position, length);
} // etcetera

Il contenuto delle funzioni è in gran parte lo stesso; tuttavia, i messaggi di errore che desidero utilizzare nelle eccezioni generate sono molto diversi e dipendono dagli argomenti. C'è un modo migliore per scrivere questo?

    
posta EMBLEM 26.03.2015 - 02:16
fonte

4 risposte

2

Non esiste un vero migliore modo. Ci sono alcune opzioni:

  1. Crea una gerarchia di eccezioni con una classe per ogni specifica eccezione che eredita da una classe base comune (ad esempio la classe di eccezioni che stai utilizzando ora). Ogni classe specifica di eccezione contiene quindi i dettagli dell'errore riscontrato e può generare un messaggio leggibile quando viene chiamato il metodo what() .
    Questa opzione è particolarmente utile se vuoi differenziare tra le diverse eccezioni nelle tue clausole di cattura.
  2. Utilizza un singolo tipo di eccezione che viene riempito con diversi messaggi nel punto di lancio.
    Questo è il tuo approccio attuale ed è perfettamente valido se sai in anticipo che il codice chiamante non avrà mai bisogno di distinguere tra i diversi tipi di errori.

Se non è necessario avere diversi tipi di eccezioni, allora si tratta principalmente di preferenze personali e accordi all'interno del team quali opzioni utilizzare. Non possiamo consigliarlo in questo.

    
risposta data 26.03.2015 - 08:56
fonte
1

Sembra un polimorfismo classico. Potresti creare un oggetto eccezione da cui puoi ereditare variazioni come questa?

    
risposta data 26.03.2015 - 02:58
fonte
1

Cosa c'è di sbagliato con:

// ... do some stuff inside a function
if (errorCondition1) {
    sprintf(gmsg,"Invalid character %c at %d",echar,epos)
    throw_general_exception(gmsg);
} else if (errorCondition2) {
    sprintf(gmsg,"Wrong length record position %d length %d",position,length)
    throw_general_exception(gmsg);
} // etcetera

A meno che tu non voglia gestire uno degli errori in un modo completamente diverso, con eccezioni specifiche per ogni possibile errore è solo un sacco di lavoro per una piccola ricompensa.

    
risposta data 26.03.2015 - 03:44
fonte
0

Lo stai rendendo troppo complicato. Basta lanciare un InputValidationException e trovare un modo per l'eccezione di portare alcune informazioni aggiuntive (questo potrebbe essere semplice come un messaggio di errore), in modo che tu possa identificare l'errore di convalida dell'input in modo specifico.

    
risposta data 26.03.2015 - 04:13
fonte

Leggi altre domande sui tag