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?
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.
Ich denke, es gibt drei Gründe, einen Catch-Block zu haben:
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.
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.
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.
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.