2008-10-24 3 views

Antwort

7

Fang nur Ausnahmen dass Sie können Griff. Wenn Sie beispielsweise externe Ressourcen verwenden, ist es am besten, spezifische Ausnahmen zu erfassen, von denen Sie wissen, dass Sie damit umgehen können. Im Falle von Dateien kann dies sein (IOException, SecurityException, etc), im Falle von Database kann die Ausnahme SqlException oder andere sein.

In jedem Fall nicht fangen Ausnahmen, die Sie nicht Griff haben, lassen Sie sie in eine obere Schicht kann man erkennen, fließen. Oder wenn Sie aus irgendeinem Grund Ausnahmen abfangen, aber nicht mit ihnen umgehen, wiederholen Sie sie nur mit werfen; (wodurch ein erneutes IL-Op im Gegensatz zu trow erstellt wird).

Im Falle der Verwendung von Ressourcen, die Sie nicht wissen, welche Art von Ausnahmen auslösen könnte, sind Sie gezwungen, den allgemeinen Ausnahmetyp zu fangen. 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) steigen zu lassen, wo sie angezeigt oder protokolliert werden können.

0

Ich denke, die absolute Antwort ist völlig bedingt (wie Kontrolle haben Sie ü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 wählen über die möglicherweise langsamere Leistung.

0

es hängt immer davon ab, was Sie erreichen möchten. Ein Server, der nicht reagiert, ist möglicherweise ernst genug, um alle Vorgänge 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, also müssen Sie ihn irgendwo finden.

2

Eric Lippert hat einen guten Blog zu diesem, here.

Es gibt keinen Punkt (außer "vexing" (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 UI 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 Gleiche zu tun.

3

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

  • Sie die Ausnahme behandeln können und erholen (von „low level“ Code)
  • Sie möchten die Ausnahme (wieder rewrap, von „low level“ -Code)
  • Sie befinden sich auf der Oberseite des Stapels, und während Sie den Vorgang nicht wiederherstellen kann sich, Sie wollen nicht die ganze app

gehen Wenn Sie kleben zu diesen solltest du sehr fe haben w fangen Blöcke im Vergleich zu try/finally Blöcke - und diese try/finally Blöcke sind fast immer nur Dispose aufrufen, und daher am besten als using Aussagen geschrieben.

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