Ich frage mich nur, ob dies als eine klare Verwendung von goto in C# betrachtet wird:
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;
}
Ich denke, das ist in Ordnung, denn der Ausschnitt ist klein und sollte sinnvoll sein. Gibt es eine andere Art und Weise Menschen in der Regel von Fehlern wie diese erholen, wenn Sie den Vorgang nach der Behandlung der Ausnahme wiederholen möchten?
Bearbeiten: Das war schnell. Um ein paar Fragen zu beantworten und die Dinge ein wenig zu klären - dies ist Teil eines Prozesses, der im Wesentlichen eine Konvertierung von einer anderen Art von Projekt ist. Der Aufruf _userInteractor.GetDatabaseConnector() ist der Teil, der bestimmt, ob der Benutzer es erneut versuchen möchte (möglicherweise mit einer anderen Datenbank als der in der Konfiguration, aus der er lädt). Wenn er null zurückgibt, wurde keine neue Datenbankverbindung angegeben und der Vorgang sollte vollständig fehlschlagen.
Ich habe keine Ahnung, warum ich nicht daran gedacht habe, eine while-Schleife zu verwenden. Es ist wohl schon zu spät für 17 Uhr.
Bearbeiten 2: Ich habe mir die LoadDatabase()-Methode angeschaut, und es wird ein DatabaseLoaderException
wenn es scheitert. Ich habe den Code oben aktualisiert, um diese Ausnahme anstelle von Exception abzufangen.
Bearbeiten 3: Der allgemeine Konsens scheint zu sein, dass
- Die Verwendung von goto ist hier nicht notwendig - eine while-Schleife reicht völlig aus.
- Die Verwendung von Ausnahmen wie dieser ist keine gute Idee - ich bin mir allerdings nicht sicher, womit ich sie ersetzen könnte.