Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Best Practice Frage zu Exception Handling ASP.NET
degri2006
myCSharp.de - Member



Dabei seit:
Beiträge: 16

Themenstarter:

Best Practice Frage zu Exception Handling ASP.NET

beantworten | zitieren | melden

Hallo,
ich habe eine Best Practice Frage zu Exception Handling. Ich habe zwei Funktionen System.IO.CreateDirectory und System.IO.Compression.ExtractToFile. Diese Funktionen können ja viele Exceptions werfen. Was wäre hier Best Practice? Ich würde nur die Exceptions catchen, die in meinem Fall auftreten können und am Ende würde ich die allgemeinste Exception Klasse catchen. Was meint Ihr?
private Nachricht | Beiträge des Benutzers
witte
myCSharp.de - Member



Dabei seit:
Beiträge: 966

beantworten | zitieren | melden

Zitat von degri2006
Ich würde nur die Exceptions catchen, die in meinem Fall auftreten können
Nein, es kann ja alles mögliche passieren. Was macht den der Prozess? Jemand will was speichern?. Dann könntest du doch einfach dem Benutzer die Fehlemeldung anzeigen.


private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7523
Herkunft: Waidring

beantworten | zitieren | melden

Hallo degri2006,
Zitat
Ich würde nur die Exceptions catchen
fange nur die Exception die auch behandelt werden können bzw. dessen Behandlung sinnvoll ist.
"Behandeln" ist z.B. Loggen, dem Benutzer zeigen dass etwas nicht passt um es erneut zu versuchen, usw.

Irgendwo in der Anwendung (du schreibst nicht ob es eine Client- / Server-Anwendung ist) sollte allerdings ein "catch all"


try
{
    // Anwendungs-Startpunkt bei Client, z.B. in Main-Methode
}
catch (Exeception ex)
{
    // Loggen, etc.
}
durchgeführt werden, damit es keinen unbehandelten Fehler (unhandled exception) gibt, welche den Prozess terminieren würde.
(Achte auch bei Threads / Tasks darauf dass die nicht unbehandelt bleiben).



mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
degri2006
myCSharp.de - Member



Dabei seit:
Beiträge: 16

Themenstarter:

beantworten | zitieren | melden

Es handelt sich um ein Blazor Projekt(serverseitig) unter Linux. Es werden regelmäßig zip-Dateien in einem Verzeichnis abgelegt(/quellverzeichnis/md5einerbestimmtendateiimzip/a1.zip.). Das Verzeichnis hat nur Leserechte. Die Zip-Datei hat immer eine bestimmte Datei(log/log.json), die ich zum Weiterverarbeiten brauche. Diese Datei entpacke einem Hintergrundthread in ein Verzeichnis(Verzeichnis muss erzeugt werden) auf dem ich Schreibrechte habe: /verzeichnismitschreibrechten/md5einerbestimmtendateiimzip/log.json. Thread checkt voher ob, die Datei existiert. Wenn ja, dann geht zur nächsten zip. Wenn er alle zips durch sind, dann geht er für 10 Minuten schlafen.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15618
Herkunft: BW

beantworten | zitieren | melden

Dann schreib das bitte nächstes Mal dazu, denn hellsehen können wir nicht und wenn Du das zu einer Runtime wie Blazor wissen willst, dann ist das eine spezifische Frage und nicht allgemein.
Ich hab daher entsprechend den Titel um die Technologie erweitert.

Bitte erklär, was Du unter Exception Handling verstehst; denn so wie es sich liest meinst Du nicht Best Practices für Ausnahmen – .NET
Zitat
Thread checkt voher ob, die Datei existiert. Wenn ja, dann geht zur nächsten zip. Wenn er alle zips durch sind, dann geht er für 10 Minuten schlafen.
Auch wenn ich eine Processing Engine nicht direkt über Blazor machen würde: ein klassischer Fall für Datenfluss (Task Parallel Library)
Mit Dataflow lassen sich serielle Aufgaben sehr einfach umsetzen und skalieren.
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1427
Herkunft: Düsseldorf

beantworten | zitieren | melden

Zitat
Ich würde nur die Exceptions catchen, die in meinem Fall auftreten können und am Ende würde ich die allgemeinste Exception Klasse catchen.

Ich sehe das wie gfoidl - Exceptions catchen nur, wenn notwendig oder Du sie wirklich behandeln kannst.
Also wenn das Programm/der Thread abstürzen würde, der Click-EventHandler vom Button zuende ist, etc. - dann darfst Du generell fangen und ggf. loggen oder eine Fehlermeldung anzeigen. Ansonsten ist ein Catch nur sinnvoll, wenn Du über das Catch einen alternativen Ablauf steuern kannst, der genauso zum gültigen Ergebnis führt.

Es gäbe aber noch einen Fall:
Du wirfst im Catch die Exception weiter (nur "throw;" nicht "throw ex;"), das erlaubt dir vorher z.B. den Zustand aufzuräumen.
Kein "throw ex;" deshalb, weil dabei der StackTrace verloren geht, das würde die Exception wie eine neue Exception behandeln und das willst Du nicht.


Exceptions fangen und eigene Exceptions werfen kann sinnvoll sein, ist aber mit Vorsicht zu genießen - und dann solltest Du das Original möglichst als InnerException beibehalten.
Das kann z.B. sinnvoll sein, wenn Du mehrere Implementierungen einer Schnittstelle hast, die je Implementierung auch die gleichen Exceptions werfen muss, damit der Aufrufer die unterschiedlichen Exception-Typen nicht beachten muss.
private Nachricht | Beiträge des Benutzers
degri2006
myCSharp.de - Member



Dabei seit:
Beiträge: 16

Themenstarter:

beantworten | zitieren | melden

Mir ging es nur grundsätzlich darum wie Ihr das mit den Exception handhabt, wenn Ihr eine Funktion bentutz, die potentiell viele Exceptions werfen kann. Unabhängig von dem Framework/Technolgie, die eingesetzt wird.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15618
Herkunft: BW

beantworten | zitieren | melden

Es ist eine Methode, keine Funktion. In C# sind Funktionen etwas anderes.

Wie man generell Exceptions behandelt steht im Docs-Link.
Alle weiteren Umsetzungen sind im Endeffekt anwendungspezifisch bzw. kommt es auf die Exception an.

Gibt Exceptions, die kann man automatisch lösen, versuchen automatisch zu lösen; gibt welche, da muss der User aktiv werden und es gibt welche, die man gar nicht behandeln kann.
private Nachricht | Beiträge des Benutzers