Non dovresti gestire il normale flusso di programma tramite Eccezioni. Le eccezioni dovrebbero essere gestite solo se si vuole fare qualcosa con esso.
Se rimuovere un elemento di una lista vuota dovrebbe generare un'eccezione, dovresti lasciarlo. Se vuoi restituire una nuova lista vuota con questo metodo, dovresti farlo.
Non c'è 1 risposta assoluta su questo argomento, dovresti controllarlo per use-case.
Naturalmente, non fa mai male fare una programmazione difensiva e assicurarsi che gli utenti non vedano troppe eccezioni nell'uso dell'applicazione.
Nell'esempio che hai citato, probabilmente eseguirò un controllo nullo e, a seconda del metodo, forse lancio una nuova ArgumentNullException.
Un tentativo di cattura in questa situazione mi sembra un po '"sporco" secondo me, ma in uno scenario più ampio potrebbe avere più senso.
Indietro nei giorni in cui ho imparato a lanciare eccezioni è un'operazione costosa (collegamento casuale, controlla la parte inferiore della pagina) , quindi evitali se possibile.
Un'altra cosa che non mi piace davvero sugli errori di cattura è che, se non li riduci abbastanza, potresti potenzialmente rilevare un errore che non ha nulla a che fare con il pezzo di codice che vuoi veramente dai un'occhiata.
Ad esempio, se la tua applicazione è a 6 strati e stai chiamando un metodo come:
try
{
otherlayer.Method1();
}
catch(IOException ioEx)
{
//DoSomething
}
È possibile che IOException catturi qualcosa che non ti aspetti all'inizio, quindi probabilmente lo gestirai male. (potrebbe accadere se qualcuno decide di cambiare gli altri livelli a tua insaputa).
In sintesi:
Ti consiglio di non utilizzare molti blocchi di try...catch
nel tuo codice, solo quando sono realmente necessari e aggiungono qualcosa di utile, o assicurati che il flusso del tuo programma continui a funzionare.