2012-01-05 11 views
5

Il titolo dice più o meno, ma qui c'è qualche background:È una cattiva pratica scrivere un metodo che non fa nulla se non lanciare un'eccezione?

Ho un'applicazione ASP.Net MVC in cui ho bisogno di controllare un elenco di percorsi di file per esistenza. Se uno dei percorsi non esiste, viene restituito un errore.

Attualmente, ho un controller di base in cui è implementato l'evento OnException. Qui vengono gestite tutte le eccezioni non gestite e viene restituita all'utente una pagina di errore con il messaggio di eccezione.

Il modo più semplice per eseguire il controllo di cui sopra è scrivere un metodo che verifica ogni percorso dell'esistenza e, se uno di essi non funziona, è sufficiente lanciare (e registrare) un'eccezione. Questa eccezione viene quindi gestita dal controller di base e il messaggio appropriato viene restituito all'utente.

Il mio problema è che fare questo sembra una cattiva pratica. Sto scrivendo un metodo che restituisce il vuoto e il suo unico scopo è quello di lanciare un'eccezione nel raro caso in cui uno dei percorsi non esista, nella maggior parte dei casi non fa nulla. È una cattiva idea?

+2

Cosa ti fa pensare che sia sbagliato? È una pratica comune, puoi persino vederne alcuni esempi nel codice sorgente di .NET framework. –

+0

Immagino sia stato semplicemente sbagliato. Ma è bene avere un feedback che non è questo il caso. – zaq

risposta

8

Non c'è niente di sbagliato in questo.

Il framework .NET fa anche questo: ad esempio, CancellationToken ha un metodo ThrowIfCancellationRequested che non fa altro che lanciare o non lanciare a seconda di alcune condizioni.

Un altro esempio: Dispatcher del metodo VerifyAccess, che verifica se il chiamante si trova sullo stesso thread a cui si suppone che il controllo sia accessibile, e se non lo fa getta.

+0

Ok, buono a sapersi. Grazie! – zaq

0

Su .net esiste l'opzione per eseguire una nuova notimplementedexception, in modo da poter creare i metodi e implementarli in seguito. Quindi non è una cattiva pratica, la cattiva pratica è lasciarli lì quando si rilascia l'applicazione alla produzione. Dare errori senza motivo è una cattiva pratica.

Per TDD (sviluppo basato su test) può essere molto utile, si crea il metodo, quindi il test dell'unità che non riesce con l'eccezione non implementata e infine si implementa il metodo per superare il test.

Btw che stava rispondendo al titolo della tua domanda, ma dovresti rinominare la domanda perché il tuo metodo fa qualcosa. Se fa qualcosa e genera sempre un'eccezione è una cattiva pratica, le eccezioni sono costose, dovresti registrare l'errore e andare avanti, senza eccezioni. Dovresti fare una funzione PathExists che restituisca un booleano, questa è una soluzione migliore. (anche se qualcuno mi vota -1 senza motivo ... Heheh)

+0

Ti ho dato un +1 per incoraggiarti a rimanere sul sito, ma penso anche che questa non sia una buona risposta: penso che manchi il punto della domanda. Il tuo esempio con 'NotImplementedException' è completamente diverso. Inoltre, il terzo paragrafo della tua risposta è ancora un po 'non correlato e dovresti averlo postato come commento. –

+0

Il metodo in questione non genera sempre un'eccezione, infatti la stragrande maggioranza delle chiamate non genera un'eccezione.Un'eccezione viene generata solo se uno dei percorsi non esiste, cosa che normalmente non si verifica. Restituire un booleano significa anche perdere informazioni su quale percorso non è valido. A proposito, non ti ho votato, il tuo ragionamento è ben spiegato e ha senso ma non si adatta alla mia situazione. – zaq

+0

Quindi, è una faccenda normale, se fallisce getta un'eccezione, se non lo è, restituisce solo il nulla. Quindi non è affatto una cattiva pratica, è solo un metodo vuoto che controlla qualcosa. – H27studio

0

Qualcuno potrebbe dire che è una cattiva idea ma, a volte, non c'è un'alternativa sana. Se vuoi sollevare un'eccezione per comunicare un errore a un altro chiamante, (magari isolato dal raiser tramite codice di terze parti opaco), fallo. L'arbitro finale: "Funziona?"

Problemi correlati