Ich frage mich nur, ob dies eine klare Verwendung von goto in C # ist:
%Vor%Ich denke, das ist in Ordnung, weil das Snippet klein ist und Sinn ergeben sollte. Gibt es eine andere Möglichkeit, wie Benutzer normalerweise solche Fehler beheben, wenn Sie die Operation nach der Behandlung der Ausnahme wiederholen möchten?
Bearbeiten: Das war schnell. Um ein paar Fragen zu beantworten und die Dinge ein wenig aufzuklären - dies ist Teil eines Prozesses, der sich im Wesentlichen von einer anderen Art von Projekt ablöst. Der _userInteractor.GetDatabaseConnector () - Aufruf ist der Teil, der bestimmt, ob der Benutzer es erneut versuchen möchte (möglicherweise mit einer anderen Datenbank als der in der Config, von der sie geladen werden). Wenn NULL zurückgegeben wird, wurde keine neue Datenbankverbindung angegeben und die Operation sollte vollständig fehlschlagen.
Ich habe keine Ahnung, warum ich nicht an eine While-Schleife dachte. Es muss um 17 Uhr zu früh kommen.
Bearbeiten 2: Ich habe mir die LoadDatabase () -Methode angeschaut, und es wird DatabaseLoaderException
geworfen, wenn es fehlschlägt. Ich habe den obigen Code aktualisiert, um diese Ausnahme anstelle von Ausnahme zu erfassen.
Edit 3: Der allgemeine Konsens scheint das zu sein
Gibt es sonst noch einen anderen Weg? erholen Sie sich von solchen Fehlern, wenn Sie möchte die Operation danach erneut versuchen Umgang mit der Ausnahme?
Ja, im aufrufenden Code. Lassen Sie den Aufrufer dieser Methode entscheiden, ob er die Logik wiederholen muss oder nicht.
UPDATE:
Um dies zu verdeutlichen, sollten Sie Ausnahmen nur abfangen, wenn Sie tatsächlich damit umgehen können. Dein Code sagt grundsätzlich:
"Ich habe keine Ahnung, was passiert ist, aber was auch immer ich getan habe, hat alles verursacht sprengen ... also lass es uns nochmal machen. "
Fangen Sie spezifische Fehler, von denen Sie sich erholen können, und lassen Sie den Rest bis zur nächsten Ebene platzen. Alle Ausnahmen, die es bis ganz nach oben bringen, stellen an diesem Punkt echte Fehler dar.
UPDATE 2:
Ok, also anstatt eine ziemlich lange Diskussion über die Kommentare fortzusetzen, werde ich mit einem semi-Pseudo-Code-Beispiel arbeiten.
Die allgemeine Idee ist, dass Sie den Code nur restrukturieren müssen, um Tests durchzuführen und die Benutzerfreundlichkeit ein wenig besser zu handhaben.
%Vor%Jetzt habe ich natürlich keine Ahnung, was Ihre Anwendung versucht, und das ist ganz sicher kein Produktionsbeispiel. Hoffentlich bekommst du die allgemeine Idee. Strukturieren Sie das Programm neu, damit Sie unnötige Unterbrechungen im Anwendungsablauf vermeiden können.
Prost, Josh
Vielleicht fehlt mir etwas, aber warum können Sie nicht einfach eine While-Schleife verwenden? Dadurch erhalten Sie die gleiche Schleife für immer, wenn Sie eine Ausnahmefunktion (die einen schlechten Code hat), die Ihr Code gibt.
%Vor%Wenn Sie goto in Ihrem normalen Code verwenden müssen, fehlt Ihnen der logische Ablauf. die Sie mit Standardkonstrukten erhalten können, wenn, während, für etc ..
Ich persönlich würde dies in einer separaten Methode haben, die einen Statuscode für Erfolg oder Misserfolg zurückgibt. Dann kann ich in dem Code, der diese Methode aufrufen würde, einige magische Anzahl von Malen haben, die ich so lange versuchen würde, bis der Statuscode "Erfolg" lautet. Ich mag es einfach nicht, try / catch für den Kontrollfluss zu verwenden.
Ist es klar? Nicht wirklich. Was Sie wirklich machen wollen, ist, glaube ich, zuerst, die Datenbank zu laden und dann, falls das nicht funktioniert, versuchen Sie es anders zu laden. Ist das richtig? Lassen Sie uns den Code so schreiben.
%Vor%Dies verdeutlicht deutlicher, was Sie tatsächlich tun. Als zusätzlichen Bonus werden andere Programmierer Ihre Augen nicht aushöhlen. :)
HINWEIS: Sie möchten mit Sicherheit keine Ausnahme erfassen. Es gibt wahrscheinlich eine spezifischere Ausnahme, die Sie lieber fangen würden. Dies würde auch TheComputerIsOnFireException abfangen, nach denen es sich nicht wirklich lohnt erneut zu versuchen.
Tags und Links c# code-review goto