Ist es empfehlenswert, einen try-catch-Block in jede Funktion zu setzen, die eine DB-Verbindung öffnet und den Fehler dort aufzeichnet, oder sollte ich eher Fehler in einer höheren Schicht der Anwendung finden?
%Vor%oder besser
%Vor%Um es zusammenzufassen: Sollten Fehler so früh wie möglich im Code entdeckt werden? Oder sollte ich sie eher dort finden, wo ich mehr Informationen über den Kontext habe?
Wie immer hängt es davon ab, aber im Allgemeinen fangen Sie nur eine Ausnahme ein, wenn Sie etwas dagegen tun können, oder Sie haben einen bestimmten Code (z. B. einen Wiederholungsversuch), ansonsten lassen Sie die Ausnahme aufblühen und die oberste Ebene kann es zentral protokollieren / behandeln.
Jede andere Möglichkeit führt zu einer Menge an Protokollierungscode, der mit der gesamten Geschäftslogik vermischt ist.
Wenn Sie Ausnahmen abfangen, versuchen Sie immer, die genaueste Ausnahme zu verwenden, die Sie können. Wenn Sie beispielsweise SQL Server verwenden, fangen Sie die SqlException ab, da sie weit mehr Informationen über die Ausnahme enthält als eine generische Ausnahme. Sie können aktuelle Zeilennummern und andere nützliche Informationen zur Diagnose erhalten.
Nachdem Sie alle relevanten Elemente extrahiert und protokolliert haben, wiederholen Sie die Ausnahme oder umbrechen Sie die Ausnahme in eine weniger spezifische Ausnahme wie eine InvalidDataException oder Exception, und werfen Sie diese aus. Sie können dann diese generischen Ausnahmen auf höheren Ebenen abfangen.
%Vor%Wenn Sie diese Methode von einer höheren Ebene aufrufen, können Sie nur die InvalidOperationException abfangen. Wenn die höheren Ebenen mehr Details benötigen, stellt die InnerException die SqlException bereit, auf die zugegriffen werden kann.
Der allgemeine Ansatz bei der Ausnahmebehandlung, dem ich folge, besteht darin, nur zu erfassen, worauf ich sinnvollerweise einwirken kann. Es hat keinen Sinn, eine wirklich allgemeine Ausnahme auf niedrigeren Ebenen des Codes zu fangen, da Sie wirklich erwarten können, dass alles schief läuft oder in der Lage ist, von jeder Ausnahme, z. OutOfMemoryException oder StackOverflowException.
Ich mag den ersten Ansatz besser, aber Sie müssen noch herausfinden, was ich sonst noch tun soll, den Catch-Block ...
I Behandle normalerweise nur Ausnahmen in der Benutzeroberfläche, alles darunter löse ich immer auf die oberste Ebene zurück. Auf diese Weise wurde die Stapelverfolgung vollständig beibehalten. Du könntest immer einloggen und es werfen.
Ich habe das auch schon vorher benutzt:
%Vor%
Tags und Links .net c# error-handling try-catch