Il risultato della performance è probabilmente trascurabile, come spiegato in questa risposta .
Quindi prendiamo l'idea che le prestazioni non siano un problema. Stai lanciando System.Exception
, solo per spostare l'esecuzione nella clausola catch
. Tuttavia lanciare un BadControlFlowThatShouldBeRewrittenException
sarebbe probabilmente eccessivo.
Analizziamolo. Abbiamo:
- Metodo
GetDataFromServer
(i nomi dei metodi dovrebbero essere PascalCase in C #), che può generare un'eccezione o restituire bool
.
- Se il risultato era
true
, esegui ProcessData
.
- Ritorno
null
altrimenti.
Sembra che il metodo in cui è scritto questo codice faccia semplicemente troppe cose. GetDataFromServer
restituire un bool
sembra un difetto di progettazione, mi aspetterei che quel metodo per restituisca i dati che riceve dal server , un po 'di IEnumerable<SomeType>
che conterrebbe 0 o più elementi - es. percorso felice restituisce n elementi dove n > 0 , il percorso non-così-felice restituisce 0 elementi e il percorso infelice esplode con un'eccezione non gestita, qualunque essa sia.
Questo cambia il modo in cui appare il metodo, molto - ancora una volta è difficile dire se questo ha senso, perché il post originale ha solo un punto di uscita (e quindi non verrebbe compilato, come non tutti i percorsi di codice restituisce un valore ), quindi questa è solo un'ipotesi selvaggia:
try
{
var result = GetDataFromServer();
return ProcessData(result);
}
catch
{
return null;
}
Qui guardi ProcessData
e vedi che sta iterando result
, e restituisce null
se non ci sono elementi in IEnumerable
.
Ora perché il metodo restituisce null
? Il server era giù? C'è un bug nella query? La stringa di connessione utilizza le credenziali errate? Ogni volta che GetDataFromServer
scoppia con un'eccezione che non ti aspetti, la stai inghiottendo, spingendola sotto il tappeto e restituendo un valore di null
. Consiglierei di rilevare eccezioni specifiche in questo caso e di registrare tutto il resto; il debugging sarà molto più facile in questo modo.
Con una clausola generale catch
che non cattura l'eccezione, diventa piuttosto difficile diagnosticare qualsiasi cosa. Lo farei minimamente invece:
catch(Exception e)
{
return null;
}
Ora puoi almeno interrompere e ispezionare e
se le cose vanno male.
TL; DR : no, le eccezioni di lancio e cattura per il controllo del flusso non sono una buona idea.