Ist das eine klare Verwendung von goto?

7

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

  • Die Verwendung von goto hier ist nicht notwendig - eine While-Schleife wird gut funktionieren.
  • Ausnahmen wie diese zu verwenden, ist keine gute Idee - ich bin mir nicht sicher, wofür ich sie ersetzen soll.
Jamie Penney 19.11.2009, 03:26
quelle

7 Antworten

15
  

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

    
Josh 19.11.2009, 03:30
quelle
7

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 ..

    
Aran Mulholland 19.11.2009 03:37
quelle
4

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.

    
BFree 19.11.2009 03:29
quelle
2

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.

    
Russell Mull 19.11.2009 03:44
quelle
1

Nein, es ist nicht in Ordnung: Ссылка

    
Greg Hewgill 19.11.2009 03:30
quelle
1

Nebenbei bemerkt, ich denke, es gibt das Potenzial für eine Endlosschleife, wenn Sie immer eine Ausnahme bekommen.

Technisch gesehen ist nichts an Ihrer Goto-Struktur falsch, aber für mich würde ich stattdessen eine while-Schleife verwenden. Etwas wie:

%Vor%     
Jeremy 19.11.2009 05:02
quelle
1

    
thecoop 19.11.2009 13:23
quelle

Tags und Links