Frage

Soll ich wickeln immer externe Ressource Anrufe in einem Try-Catch? (Dh. Anrufe in eine Datenbank oder Dateisystem) Gibt es eine bewährte Methode für die Fehlerbehandlung, wenn externe Ressourcen Aufruf?

War es hilfreich?

Lösung

Fang Ausnahmen , dass Sie verarbeiten kann . So zum Beispiel, wenn externe Ressourcen, die beste Praxis ist zu fangen spezifische Ausnahmen, die Sie wissen, dass Sie behandeln können. Im Fall von Dateien kann dies (IOException, Security, usw.), bei Datenbank kann die Ausnahme SqlException oder andere sein.

In jedem Fall nicht fangen Ausnahmen, die Sie nicht behandeln , lassen Sie sie in eine obere Schicht fließt das kann. Oder wenn Sie aus irgendeinem Grund Ausnahmen fangen aber nicht behandeln sie, rethrow sie nur mit werfen;. (die eine rethrow IL op schaffen wird, im Gegensatz zu trow)

Bei Verwendung von Ressourcen, die Sie nicht wissen, welche Art von Ausnahmen auslösen könnte, sind Sie Art der allgemeine Ausnahmetyp zu fangen gezwungen. Und in diesem Fall die Safes wäre es, die genannten Mittel aus einer anderen Anwendungsdomäne zu verwenden (wenn möglich), oder lassen Sie die Ausnahme Blase bis zu Top-Level (ex UI), wo sie angezeigt oder protokolliert werden.

Andere Tipps

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

  • Sie können die Ausnahme behandeln und erholen (von "low level" Code)
  • Sie möchten die Ausnahme rewrap (wieder von "low level" Code)
  • Sie sind an der Spitze des Stapels, und während Sie den Vorgang nicht wiederherstellen kann sich, Sie wollen nicht die ganze app gehen

Wenn Sie diese halten, sollten Sie haben nur sehr wenige catch-Blöcke im Vergleich zu try/finally Blöcke - und diese try/finally Blöcke sind fast immer nur Dispose anrufen, und daher am besten als using Aussagen geschrieben.

Fazit:. Es ist sehr wichtig, einen finally Block freie Ressourcen zu haben, aber catch Blöcke sollten in der Regel seltener sein

Eric Lippert hat einen guten Blog auf diesem hier .

Es gibt keinen Punkt (mit Ausnahme von „ärgerlichen“ (siehe Blog)) fängt eine Ausnahme, wenn Sie etwas Nützliches tun können; und in den meisten Fällen kann man einfach nicht -. so lassen Sie es Blase (UI sollte offensichtlich reinigen und zeigen etwas)

Sie könnte jedoch einen „try / finally“ mit Ressourcenmanagement beschäftigen. Oder noch sauber, Block eines „using“ das gleiche zu tun.

ich die absolute Antwort denken vollständig abhängig ist (wie die Kontrolle haben Sie über die Umwelt haben, was die erwartete Balance zwischen Leistung und Konsistenz und viele andere, die ich bin sicher), aber im Allgemeinen ich immer, die Sicherheit über die Wahl die potenziell geringere Leistung.

es hängt immer ab, was Sie erreichen wollen. Ein Server nicht reagiert möglicherweise ernst genug sein, um alle zu stoppen, was die Routine, was tun, und die Ausnahme sollte den Anrufer geworfen werden.

In anderen Fällen Sie ist es egal, ob Sie die db oder nicht zu aktualisieren, ist fehlgeschlagen. Dann raubend die Ausnahme in Ordnung ist.

Offensichtlich Sie wollen nicht den Stack-Trace zu Ihren Endbenutzer zeigen, obwohl, so dass Sie es irgendwo fangen benötigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top