versuchen immer externe Ressourcenaufrufe zu erfassen?

8

Sollte ich externe Ressourcenaufrufe immer in einen try-catch umwandeln? (dh Aufrufe an eine Datenbank oder ein Dateisystem) Gibt es eine Best Practice für die Fehlerbehandlung beim Aufruf externer Ressourcen?

    
Aaron Palmer 24.10.2008, 11:55
quelle

6 Antworten

7

Fangen Sie nur Ausnahmen , die Sie verarbeiten können . Wenn Sie beispielsweise externe Ressourcen verwenden, empfiehlt es sich, spezifische Ausnahmen abzufangen, von denen Sie wissen, dass Sie mit ihnen umgehen können. Im Fall von Dateien kann dies (IOException, SecurityException usw.) sein, im Falle von Database kann die Ausnahme SqlException oder andere sein.

In jedem Fall nicht fangen Ausnahmen, die Sie nicht behandeln , lassen Sie sie auf eine höhere Ebene fließen, die kann. Oder wenn Sie aus irgendeinem Grund Ausnahmen abfangen, aber nicht mit ihnen umgehen, wiederholen Sie sie mit nur throw; (wodurch eine IL-Operation im Gegensatz zu trow erneut ausgelöst wird).

Wenn Sie Ressourcen verwenden, von denen Sie nicht wissen, welche Arten von Ausnahmen ausgelöst werden, sind Sie gezwungen, den allgemeinen Ausnahmetyp abzufangen. Und in diesem Fall wäre die Safes-Sache, die genannten Ressourcen aus einer anderen App-Domain (wenn möglich) zu verwenden oder die Exception auf die oberste Ebene (ex UI) zu bringen, wo sie angezeigt oder protokolliert werden können.

    
Pop Catalin 24.10.2008, 12:12
quelle
3

Ich denke, es gibt drei Gründe, einen Catch-Block zu haben:

  • Sie können die Exception behandeln und wiederherstellen (aus "low level" -Code)
  • Sie möchten die Exception umschreiben (wiederum aus dem Code "low level")
  • Sie befinden sich ganz oben auf dem Stapel, und obwohl Sie den Vorgang nicht selbst wiederherstellen können, möchten Sie nicht, dass die gesamte App untergeht.

Wenn Sie bei diesen bleiben, sollten Sie sehr wenige catch-Blöcke im Vergleich zu try/finally blocks haben - und diese try/finally Blöcke rufen fast immer Dispose auf und werden daher am besten als using -Anweisungen geschrieben.

Bottom line: Es ist sehr wichtig, einen finally -Block für freie Ressourcen zu haben, aber catch Blöcke sollten normalerweise seltener sein.

    
Jon Skeet 24.10.2008 12:12
quelle
2

Eric Lippert hat einen guten Blog dazu, hier .

Es gibt keinen Punkt (außer "ärgerlich" (siehe Blog)), eine Ausnahme zu fangen, es sei denn, Sie können etwas Nützliches tun; und in den meisten Fällen können Sie einfach nicht - also lassen Sie es Blase (Ihre Benutzeroberfläche sollte offensichtlich reinigen und etwas anzeigen).

Sie könnten jedoch ein "try / finally" haben, um mit der Ressourcenverwaltung umzugehen. Oder noch sauberer, ein "using" -Block um das selbe zu machen.

    
Marc Gravell 24.10.2008 12:12
quelle
0

Ich denke, die absolute Antwort ist völlig konditional (wie Kontrolle hast du über die Umwelt, was ist das erwartete Gleichgewicht zwischen Leistung und Konsistenz und viele andere bin ich sicher), aber im Allgemeinen tue ich immer, die Sicherheit über wählend die möglicherweise langsamere Leistung.

    
Timothy Carter 24.10.2008 11:59
quelle
0

es hängt immer davon ab, was Sie erreichen wollen. Ein Server, der nicht reagiert, ist möglicherweise ernst genug, um alle Aktionen der Routine zu stoppen, und die Ausnahme sollte dem Aufrufer übergeben werden.

In anderen Fällen ist es Ihnen egal, ob Sie die Datenbank nicht aktualisieren konnten oder nicht. Dann ist das Ausnutzen der Ausnahme OK.

Offensichtlich möchten Sie den Stack-Trace jedoch nicht Ihrem Endbenutzer zeigen. Sie müssen ihn also irgendwo abfangen.

    
Luk 24.10.2008 12:03
quelle

Tags und Links