Il colpo di scena è probabilmente trascurabile, come spiegato in questa risposta .
Quindi andiamo con l'idea che le prestazioni non siano un problema. Stai lanciando System.Exception
, solo per spostare l'esecuzione nella catch
clausola . Lanciare a BadControlFlowThatShouldBeRewrittenException
sarebbe probabilmente eccessivo.
Analizziamo questo. Abbiamo:
- Metodo
GetDataFromServer
(i nomi dei metodi devono essere PascalCase in C #), che può eventualmente generare un'eccezione o restituire a bool
.
- Se il risultato è stato
true
, esegui ProcessData
.
- Ritorna
null
altrimenti.
Sembra che il metodo in cui è scritto questo codice, stia semplicemente facendo troppe cose. GetDataFromServer
restituendo un bool
aspetto simile a un difetto di progettazione, mi aspetterei che quel metodo restituisca i dati che sta ricevendo dal server , alcuni IEnumerable<SomeType>
che conterrebbero 0 o più elementi - vale a dire il percorso felice restituisce n elementi in cui n> 0 , non così felice path restituisce 0 elementi e il percorso infelice esplode con un'eccezione non gestita, qualunque essa sia.
Ciò cambia l'aspetto del metodo, abbastanza - ancora una volta è difficile capire se questo ha senso, perché il post originale ha solo un punto di uscita (e quindi non si compila, poiché non tutti i percorsi di codice restituiscono un valore ), quindi questa è solo un'ipotesi selvaggia:
try
{
var result = GetDataFromServer();
return ProcessData(result);
}
catch
{
return null;
}
Qui guarderesti ProcessData
e vedresti che sta iterando il result
, e ritorna null
se non ci sono elementi nel IEnumerable
.
Ora, perché il metodo sta tornando null
? Server inattivo? C'è un bug nella query? La stringa di connessione utilizza credenziali errate? Ogni volta che GetDataFromServer
esplode con un'eccezione che non ti aspetti, lo stai ingoiando, spingendolo sotto il tappeto e restituendo un null
valore. In questo caso, consiglierei di cogliere eccezioni specifiche e di registrare tutto il resto; il debug sarà molto più semplice in questo modo.
Con una catch
clausola generale che non cattura l'eccezione, diventa abbastanza difficile diagnosticare qualsiasi cosa. Invece lo farei minimamente:
catch(Exception e)
{
return null;
}
Ora puoi almeno rompere e ispezionare e
se le cose vanno male.
TL; DR : No, lanciare e catturare le eccezioni per il controllo del flusso non è una buona idea.