Position der try catch-Anweisung

8

Ich habe etwas Code, der momentan ungefähr so ​​aussieht:

%Vor%

Wie Sie sehen, wickle ich den Aufruf derzeit in SomeProblemFunction um eine try -Anweisung herum, weil diese Funktion fehlschlagen könnte (sie beruht auf einem externen Webservice-Aufruf).

Meine Frage lautet: Soll die try -Anweisung a) außerhalb der Problemfunktion (wie ich sie jetzt habe) oder b) innerhalb der Problemfunktion liegen?

Danke.

    
frenchie 05.02.2014, 19:06
quelle

6 Antworten

7

Normalerweise möchten Sie, dass Ihre Ausnahmen bis zu den Anwendungsgrenzen weitergegeben werden. Sie werden nur eines der wenigen Dinge mit Ihrer Ausnahme machen wollen:

  • Wrap es
  • Ersetzen Sie es
  • Lass es propagieren

Aktualisieren

Aus Ihrer Frage scheint es, dass Sie eine fehlertolerante Lösung für Ihre Web-Service-Anrufe suchen. Das ist ein komplexeres Problem als einfach nur "wo setze ich meinen Versuch ein?" Sie würden Ihre Ausnahmebehandlung immer noch an der Anwendungsgrenze platzieren, aber dort würden Sie Ihre Fehlertoleranzstrategie implementieren. Dazu müssten viele Überlegungen angestellt werden, z. B. das asynchrone Aufrufen Ihres Webdiensts, die Anzahl der Wiederholungsversuche usw. Ich würde eine Suche nach Fehlertoleranz für Webdienste vorschlagen.

    
Aaron Palmer 05.02.2014, 19:10
quelle
4

Was Sie haben, ist richtig; Weitere Informationen finden Sie im MSDN-Beispiel :

%Vor%     
quelle
2

Als Faustregel versuche ich, Code zu erstellen, der die Fänge genau an die Stelle fokussiert, an der das Problem auftreten kann.

Das besagt, dass beide Lösungen korrekt sind.

Wenn es mein Code wäre, würde ich das tun

%Vor%

Mit dieser Methode können Sie problemlos Anwendungen erstellen, die eine Reihe sehr genauer Ausnahmen behandeln

    
Anthony Russell 05.02.2014 19:13
quelle
2

Eine gute Frage, denke ich. Ich werde eine Antwort versuchen.

Wenn Sie innerhalb von SomeProblemFunction wiederherstellen wollen, dann wäre es sinnvoll, das try...catch innerhalb dieser Methode zu verschieben. Wenn Sie jedoch sagen, dass etwas in SomeProblemFunction fehlschlägt, dann ist das Ganze ein Fehler, dann behalten Sie es so, wie Sie es jetzt haben, und erholen Sie sich in MainFunction oder werfen Sie es aus.

Dank dem Kommentar unten, füge ich etwas Klarheit hinzu. Abhängig von der spezifischen Ausnahme, die in SomeProblemFunction ausgelöst wird, können Sie möglicherweise nicht innerhalb dieser Methode wiederherstellen. Wenn Sie eine Mischung aus wiederherstellbar und nicht wiederherstellbar haben, wäre es ratsam, die try...catch an beiden Orten zu haben.

Das Wichtigste ist, dass Sie NIE eine Ausnahme abfangen, von der Sie nicht wiederherstellen können, ohne sie nach der Ausführung Ihrer Aufgabe weiter zu werfen. Es ist verlockend, große, breite Fänge hinzuzufügen ( catch (Exception) ), um zu verhindern, dass Ihre App während der Entwicklung abstürzt, aber es lohnt sich nie. Wenn diese Dinge es in Ihren Produktionscode geschafft haben, haben Sie einen Albtraum zur Problemlösung und zum Debuggen eingeführt.

    
Brian Warshaw 05.02.2014 19:11
quelle
1

Meiner Meinung nach gibt es dafür keine eindeutige Antwort. Der try catch wird verwendet, um die eventuell auftretenden Ausnahmen zu behandeln. Wenn Ihr Ausnahmebehandlungscode in der Hauptfunktion ist, sollten Sie versuchen, die Hauptfunktion zu fangen. Wenn Ihr Ausnahmebehandlungscode in der Problemfunktion enthalten ist, sollten Sie ihn zur Problemfunktion hinzufügen.

Meine Präferenz ist jedoch, es in beide Funktionen zu setzen. Wenn Sie den try catch in die Problemfunktion einfügen, können Sie die Ausnahme auslösen und in der Hauptfunktion abfangen. Dies erscheint anderen Entwicklern immer so, dass die Ausnahme in dieser Funktion berücksichtigt wurde und sie nicht versehentlich übersehen wurde.

    
malkassem 05.02.2014 19:12
quelle
1

Dies hängt davon ab, wie schwerwiegend dieser Ausfall des Web-Service-Aufrufs sein würde.

Ist es ein Fehler, der die weitere Verarbeitung Ihres Codes verhindert? Wenn ja, versuchen Sie es hier nicht und versuchen Sie, sich an den Typ zu wenden, der wissen muss, dass dieser Web-Service-Aufruf fehlgeschlagen ist. Optional könnten Sie eine neue Exception mit einem aussagekräftigeren Exception-Typ / Details abfangen und werfen.

Möchten Sie den Web Service-Aufruf einfach erneut versuchen, wenn er nicht funktioniert? Wenn ja, dann hast du den Versuch an der richtigen Stelle; Sie müssen nur eine Schleife hinzufügen.

Ist es nicht schlimm, wenn dieser Web Service-Aufruf fehlschlägt? z.B. - Funktioniert der Rest Ihres Codes? (Ich habe festgestellt, dass dies ungewöhnlich ist). Wenn dies der Fall ist, lassen Sie try / catch dort, wo es ist, und protokollieren Sie den Fehler irgendwo, damit Sie gewarnt werden.

    
dferraro 05.02.2014 19:21
quelle

Tags und Links