Basta chiedersi se questo è considerato un chiaro uso del goto in C#:Si tratta di un chiaro uso di goto?
IDatabase database = null;
LoadDatabase:
try
{
database = databaseLoader.LoadDatabase();
}
catch(DatabaseLoaderException e)
{
var connector = _userInteractor.GetDatabaseConnector();
if(connector == null)
throw new ConfigException("Could not load the database specified in your config file.");
databaseLoader = DatabaseLoaderFacade.GetDatabaseLoader(connector);
goto LoadDatabase;
}
mi sento come questo è ok, perché il frammento è piccolo e deve avere un senso. C'è un altro modo in cui le persone di solito si riprendono da errori come questo quando si desidera riprovare l'operazione dopo aver gestito l'eccezione?
Modifica: Era veloce. Per rispondere ad alcune domande e chiarire un po 'le cose, questo fa parte di un processo che si sta essenzialmente convertendo da un diverso tipo di progetto. La chiamata _userInteractor.GetDatabaseConnector() è la parte che determinerà se l'utente desidera riprovare (possibilmente con un database diverso da quello nella configurazione da cui sta caricando). Se restituisce null, non è stata specificata alcuna nuova connessione al database e l'operazione dovrebbe fallire completamente.
Non ho idea del motivo per cui non ho pensato di utilizzare un ciclo while. Deve essere troppo vicino alle 17:00.
Modifica 2: Ho dato un'occhiata al metodo LoadDatabase() e genererà un DatabaseLoaderException
se fallisce. Ho aggiornato il codice sopra per catturare quell'eccezione invece di Eccezione.
Edit 3: Il consenso generale sembra essere che
- Utilizzando goto qui non è necessario - un ciclo while farà bene.
- L'utilizzo di eccezioni come questa non è una buona idea - non sono sicuro di cosa sostituirlo con.
alcuna necessità di votare giù una domanda legittima, perché ha il goto parole in esso. –
Per l'OP: l'utilizzo non deve essere "chiaro". Deve essere "corretto". Il tuo utilizzo è chiaro, ma molto scorretto. Avete grandi risposte qui, ascoltate loro :-) –
Ma questo non significa che la domanda dovrebbe essere downvoted. –