2012-04-02 10 views
6

Questa potrebbe essere una domanda nasca, ma qualunque cosa. Va bene usare le eccezioni per la convalida del modulo? Diciamo che ho un modulo che chiede agli utenti il ​​loro nome ed e-mail, è giusto fare quanto segue?Le eccezioni devono essere utilizzate per la convalida del modulo?

try { 
    if (empty($_POST["name"])) { 
     throw new UserRegistrationException("Your name cannot be empty."); 
    } 

    if (filter_var($_POST["email"])) { 
     throw new UserRegistrationException("Invalid email"); 
    } 

    // Save new user into database 
} catch (UserRegistrationException $e) { 
    // Show errors on screen 
} 

anche -se questo è in realtà il modo corretto di fare it- se l'utente invia sia un nome vuoto e una e-mail valido, sarebbero entrambe le eccezioni eseguire o solo quella che appare per primo (il nome uno in questo caso)?

Sto usando PHP a proposito.

+0

È sicuramente uno strano modo di utilizzare le eccezioni. "eseguiranno entrambe le eccezioni o solo quella che appare per prima" - è così difficile scrivere 5 righe di codice e vedere te stesso? – zerkms

+0

Solo il primo verrebbe lanciato e catturato, altri saltati. Se hai bisogno di accumulare messaggi di errore, è meglio usare solo una semplice vecchia catena if/else e accodare messaggi su un array. –

+0

@ Michael ho pensato così ... Sembrava comunque una buona idea usare le eccezioni (dato che l'input non valido dovrebbe essere considerato _exceptional_), ma mi limiterò a if/else's – federicot

risposta

4

Personalmente mi piace usare eccezioni per tutto ciò che dovrebbe interrompere o alterare il flusso del programma. In altre parole, se la convalida di un particolare campo cambia il modo in cui i dati vengono elaborati o richiede la ripetizione del processo, utilizzo sempre l'eccezione per la gestione degli errori.

Se è banale, o sto semplicemente compilando un elenco di messaggi di errore, quindi non faccio scattare eccezioni.

Per rispondere alle domande, non è possibile lanciare due eccezioni allo stesso tempo. Sarà lanciata la prima dichiarazione di tiro che è stata raggiunta. Questo non vuol dire che a volte non ha senso ripensare come un altro tipo di eccezione.

+0

Immagino che questo sia, come dici tu, un caso banale (e sto anche compilando una lista di messaggi di errore) quindi le eccezioni non si adattano in questo caso – federicot

+0

È anche possibile estendere la classe Exception per aggiungere una serie di eccezioni costruite, quindi generare un'eccezione aggregata (che è possibile utilizzare per compilare un elenco di messaggi di errore, scorrere fino a trovare un particolare di interesse, ecc.) – landons

+0

Oppure è possibile creare una raccolta di errori di convalida alla vecchia maniera (ad esempio aggiungendo a un array), quindi lanciare un'unica eccezione di convalida contenente tutti quegli errori. –

4

Il caso d'uso per le eccezioni è condizioni eccezionali. In questo caso, ti aspetti che i campi nome utente e password siano vuoti? Se stai visualizzando un modulo web, direi che, sì, ti aspetti campi vuoti di nome utente e password, quindi dovresti controllare esplicitamente questa condizione, piuttosto che lanciare un'eccezione.

Per rispondere alla domanda specifica, entrambe le eccezioni non verranno generate se si verifica un errore. L'istruzione throw invierà il programma nel blocco catch. Da lì il controllo scorrerà normalmente.

+5

Secondo la tua definizione, ogni eccezione è inaspettata. Come diavolo sapresti come gestirlo allora? Direi che le eccezioni sono utilizzate per i casi in cui l'esecuzione primaria non dovrebbe continuare. – landons

+0

Per non parlare si potrebbe semplicemente aggiungere gli errori di convalida ad una matrice e poi esplodere in una stringa che viene poi lanciata come eccezione – Alex

Problemi correlati