Laden...

Fehler per Exception abfangen oder per if ausschliessen?

Erstellt von Kiboman vor 7 Jahren Letzter Beitrag vor 7 Jahren 4.541 Views
K
Kiboman Themenstarter:in
15 Beiträge seit 2016
vor 7 Jahren
Fehler per Exception abfangen oder per if ausschliessen?

Guten Abend, ich kann meine Frage garnicht schön Formulieren.

Also nur kurz.
Ich habe einen Test Code geschrieben wo ich mit Exception gespielt habe.
Das ist ein Stück Code der eine XML laden soll um daraus das Object Deserialisieren soll.

kann man das im untenstehenden code so lassen oder ist es besser dem exception zuvor zu kommen und z.b. fehlende Directorys per if ausschließen?

so wie es jetzt ist finde ich es am übersichtlichsten?

mir fällt grade auf,
in meinem Code würde noch die Behandlung für einen Zugriffverweigert fehlen. wo würde man den einbauen?

public Form1()
        {
            InitializeComponent();
            try
            {
            loadXML();
            SRVControl.start();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + "\n\n\n" + e.StackTrace);
            }
        }
        private bool loadXML()
        {
            Begin:
            try
            {
                System.Xml.Serialization.XmlSerializer reader = new System.Xml.Serialization.XmlSerializer(typeof(ServerController));
                file = new System.IO.StreamReader(cfgpfad+cfgfile);
                SRVControl = (ServerController)reader.Deserialize(file);
                file.Close();
            }
            catch (DirectoryNotFoundException)
            {
                Directory.CreateDirectory(cfgpfad);
                goto Begin;
            }
            catch (FileNotFoundException)
            {
            SRVControl = new ServerController();
                saveXML();
                goto Begin;

            }
            catch (InvalidOperationException)
            {
                file.Close();
                File.Delete(cfgpfad+cfgfile);
                goto Begin;
            }
            return true;
        }

        private bool saveXML()
        {
            var writer = new System.Xml.Serialization.XmlSerializer(typeof(ServerController));
            var wfile = new System.IO.StreamWriter(cfgpfad+cfgfile);
            writer.Serialize(wfile, SRVControl);
            wfile.Close();
            return true;
        }
16.834 Beiträge seit 2008
vor 7 Jahren

Der größte Fehler dieses Codes ist das goto.
Absolutes NoGo! Auf Deutsch: gewöhn Dir den Schei* gar nicht erst an.

Exceptions soweit weiter geben, bis man sie sinnvoll verarbeiten kann.
Niemals einfach unterdrücken.

Logik von UI trennen.
[Artikel] Drei-Schichten-Architektur

K
Kiboman Themenstarter:in
15 Beiträge seit 2016
vor 7 Jahren

Also goto weg.
D.h. Die methode soll sich lieber selbst aufrufen?
Oder gibt es eine ganz elegante lösung nach der exception?

16.834 Beiträge seit 2008
vor 7 Jahren

Nimms mir nicht böse, aber womöglich solltest Du erstmal allgemeine C# / .NET Basics erlenren, bzw OOP, wenn Du hier goto verwendest oder in Betracht ziehst.
Das Exception Handling der 20 Zeilen hier ist echt das geringste Problem 😃

Davon abgesehen, gibt es nicht die eine perfekte Lösung für Exception Handling.
Es kommt auf die Gesamtanwendung an und selbst diese könnte man verschieden implementieren.

Tu Dir wirklich ein gefallen und mach ein OOP Tutorial und erlern die C# Basics.
Du wirst ansonsten sehr schnell sehr frustriert sein und die Lust verlieren. Ist ein gut gemeinter Rat.

H
18 Beiträge seit 2010
vor 7 Jahren

Hi,

dass Goto böse ist ist ja bereits geklärt 😉

Zu Deinen Exception-Behandlungen: lieber vorab prüfen, ob das Verzeichnis (cfgpfad) existiert und ggf. erstellen:

if (!Directory.Exists(cfgpfad))
{
   Directory.Create(cfgpfad);
}

Dasselbe in grün gilt für die FileNotFoundException.

Statt dem stillen Behandeln der InvalidOperationException würde ich den User auf jeden Fall über den Fehler informieren und die nicht ladbare XML umbenennen, bevor sie gelöscht und neu erstellt wird.

Für die Zugriffsverweigerung würde ich ebenfalls eine sinnvolle Meldung an den User ausgeben, die auch den Inhalt von Exception.Message enthält.

Pfade sollte man übrigens mit Path.Combine() verknüpfen, da man sich dabei um evtl. fehlende Backslashes nicht kümmern muss.

Gruß
Patrick

16.834 Beiträge seit 2008
vor 7 Jahren

Spezifische Exceptions sollten immer abgefangen werden, auch mit einer Vorab-Prüfung.
Mit viel Pech löscht einer genau den Ordner, in den Du gerade kopieren willst.
-> Defensive Programmierung

K
Kiboman Themenstarter:in
15 Beiträge seit 2016
vor 7 Jahren

Danke, eure tipps werde ich beherzigen und umsetzten.

Ich habe relativ viel erfahrung mit php und oop.

Aber ich habe gemerkt php ist schön linear, in der umsetzung und den logischen abläufen, ziemlich wie soll man sagen kinderkram im vergleich zu c#

Ich muss mich erst einmal an die "neue" art und vielzahl der möglichen und der fehler behandlung gewöhnen.

Und wenn man hier von kompetenten leuten die best practice erläutert bekommt steht dem erfolg doch nichts im wege.

16.834 Beiträge seit 2008
vor 7 Jahren

Um gehässig zu sein: PHP wird nicht programmiert, sondern zusammen gescriptet / geschustert 😃
Das, wasde da gelernt hast, sollteste in C# nicht machen. Machs richtig 😉

K
Kiboman Themenstarter:in
15 Beiträge seit 2016
vor 7 Jahren

Das ich das so nicht machen kann hab ich schon gemerkt, deshalb bin ich hier 😉

Die msdn seiten sind schön und gut aber teils sind die beispiele ziemlich überladen.

16.834 Beiträge seit 2008
vor 7 Jahren

Überladen?! 🤔 Ahja... 😉

T
2.224 Beiträge seit 2008
vor 7 Jahren

Die MSDN ist nicht überladen 😃
Manchmal passen einfach die Beispiel nicht zu der Lösung die man sucht/braucht.
Die MSDN ist sonst eigentlich neben dem Referenz Code von C# eigentlicht die beste Möglichkeit um konkrete Probleme besser lösen zu können.
Eben in dem man sich die vorhandenen Möglichkeiten von .Net über MSDN anschaut oder über den Referenzcode genau nachvollziehen kann was eine bestimmte Klasse/Methode eigentlich macht.

Aber zurück zum Thema:
PHP ist für den Einstieg in die Programmierung eigentlich ganz okay.
Man muss halt nur mit vielen PHP Eigenarten brechen, wenn man mit richtigen Programmiersprachen anfängt.

Mit der Zeit wird sich das aber alles festigen, dann brauch man auch keine Kosntrukte wie goto 😃
Mit richtigen Strukturen im Code, kann man goto meistens sauber durch schleifen/methoden Aufrufe sauberer lösen.
Aber das hängt eben auch etwas von der Situation ab.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

H
116 Beiträge seit 2008
vor 7 Jahren

Hi,

war auch länger nicht hier, so dass ich das Thema mal als Einstieg nutzen möchte.

Um nochmal auf den Kern der Eingangsfrage zu kommen: Exceptions sind recht "teuer" in der Laufzeit. Und sie sind, wie der Name schon vermuten lässt, Ausnahmen. Natürlich sollen und müssen die an geeigneter Stelle behandelt werden. Aber für mein Verständnis sollte der geregelte Programmfluss durch if-Anweisungen erfolgen und eine Exception nur für Notfälle herhalten.

Hinrich

T
461 Beiträge seit 2013
vor 7 Jahren

Ich versuche auch meist mögliche Fehlerquellen weg zu 'if'en, so wie ich es hier gelernt habe 😉 gleich am Anfang der Methode.

Exception-Blöcke kommen bei mir nur weniger vor und fahre sehr gut damit..

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄