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.
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:
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.
Was Sie haben, ist richtig; Weitere Informationen finden Sie im MSDN-Beispiel :
%Vor%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
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.
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.
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.
Tags und Links c#