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?versuchen immer externe Ressourcenaufrufe?
Antwort
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.
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.
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.
Das ist, was ich gefunden habe und es macht Sinn für mich .. für die offensichtliche Dinge manuell überprüfen, lassen Sie versuchen Beifang tun den Rest ..
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.
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.
- 1. Ungelöste externe versuchen, ffmpeg
- 2. Überlagert eingebettete CSS immer externe CSS?
- 3. Linking externe Bibliothek zum Projekt gibt immer noch undefined Referenz
- 4. Wordpress - Instanz generiert immer Seite, die auf externe Seite
- 5. Express js mit für immer nicht auf externe IP hören
- 6. Wenn versuchen xml parsen mit Attributen leeres Array immer
- 7. Versuchen zu überprüfen, ob das Array immer zunimmt
- 8. versuchen, jede Zeile in der Datei ausgegeben immer 'cat $ file'
- 9. Sollte Picasso versuchen Bild Laden für immer, wenn kein Internetzugang
- 10. kubernetes - externe Firewall-Zugang
- 11. Mischen von JavaScript mit C# -Code mit tiefer Verschachtelung. Versuchen, externe Datei
- 12. Versuchen
- 13. versuchen
- 14. Externe Speicherverwaltung und COM
- 15. immer
- 16. Fallback für externe Webpack-Bibliotheken
- 17. Unity WebGL Externe Assets
- 18. Python versuchen/außer: versuchen, mehrere Optionen
- 19. EXC_BAD_ACCESS, wenn sie versuchen
- 20. externe css override
- 21. Python versuchen/außer weiter versuchen, bis keine Fehler
- 22. Android externe SD-Karte Zugriff
- 23. .NET Externe Kommunikation
- 24. Versuchen, Boost
- 25. Python versuchen, außer endlich
- 26. angularjs2 versuchen, benutzerdefinierte Rohre
- 27. Versuchen, goroutines zu verstehen
- 28. DNS: interne und externe Nameserver
- 29. Eine externe IP-Adresse blockieren
- 30. Versuchen, Ereignis zu C#