File einlesen mit Exception

File einlesen mit Exceptions

Description: In diesem Video lernt ihr try catch und finally block richtig zu verwenden.

Duration: PT21M13S

ContentUrl: https://progressivemlx-a.akamaihd.net:443/asset-35a49344-5ebc-4b0f-a9cc-e5d665bd0533/20616-277772-gcyviazs.jlh_H264_3400kbps_AAC_und_ch2_96kbps.mp4?sv=2012-02-12&sr=c&si=3ce6d914-db96-49f5-9640-591b81e7696a&sig=mYpvTrX6hMOpB%2BjtCzsL3x%2FJ6hcmF%2FC5jLTfQqf0JpU%3D&st=2016-03-23T03%3A53%3A22Z&se=2018-12-18T03%3A53%3A22Z

EmbedUrl: https://mva.microsoft.com/en-US/training-courses-embed/c-fundamentals-for-absolute-beginners-16169/Video-Gracefully-Handling-Exceptions-NUjUyKRIC_2106218949

UploadDate: 2016-03-25T12:40:00+02:00

Thumbnail

Inhaltszusammenfassung

In dieser Übung geht es um das Einlesen von Dateien und das Arbeiten mit Fehlermeldungen. Diese Fehlermeldungen treten nur während der Laufzeit des Programmes auf. Zum Beispiel beim Einlesen einer Datei, die nicht existiert oder der Umwandlung eines Strings in eine Zahl, wenn der String außer Zahlen auch noch Buchstaben enthält.


Durchführung

Erstellen wir zuerst eine Textdatei in einem beliebigen Ort und nennen sie "Example.txt". Um mit Dateien zu arbeiten, müssen wir "using System.IO;" am Anfang der Datei schreiben. Dies stellt uns Klassen zum Arbeiten mit Dateien zur Verfügung. Um eine Datei als "string" einzulesen benützt man die "Files" Klasse. Sie stellt mehrere Methoden zur Verfügung. .ReadAllText hat als Rückgabe einen einzigen String mit dem ganzen Text. Die Methode .ReadAllLines hat als Rückgabeergebnis ein String-Array wo jede Zeile im Text ein Wert im Array ist. In diesem Beispiel verwenden wir vorerst einmal die .ReadAllText Methode und lesen unsere File ein, aber ändern den Pfad im Code, sodass unser Programm die Datei NICHT findet.

class Program
{
static void Main(string[] args)
{
string content = File.ReadAllText(@"C:\Lesson22\Exampl.txt");
Console.WriteLine(content);
Console.ReadLine();
}
}

Notiz: Verwendet man in einem String das Symbol "\" ,wird es als Systemkommando erkannt, wie zum Beispiel ein Zeilenumbruch bei \n
Schreibt man vor dem String ein "@"-Zeichen, werden Backslashes auch wirklich im String erkannt und nicht als Befehl für Sonstiges.

Würde man jetzt das Programm ausführen,  würde es einen Fehler, d. h. eine Exception, werfen, da es die Datei nicht gefunden hat. Unser Programm soll aber trotz Fehler weiterlaufen. Dafür behandeln wir die Exception in einem try-catch-Block. In das TRY kommt der Codeteil, der eine Exception werfen könnte. Wird in dem TRY-Block ein Fehler geworfen, fängt der CATCH-Block den Fehler ab und führt "seinen" Code aus, das heißt, den Code innerhalb des Catch Statements. Verschieben wir den Code (für das Einlesen eines Files) nun in den try-Block:

class Program
{
static void Main(string[] args)
{
try
{
string content = File.ReadAllText(@"C:\Lesson22\Exampl.txt");
Console.WriteLine(content);
Console.ReadLine();
}
catch
{

}
}
}

Würde man jetzt das Programm starten, beendet es sich sofort wieder, da es im try-Block nur die erste Zeile ausführt und mit der Fehlermeldung sofort in den catch-Block geht, ohne die anderen Zeilen auszuführen. Deswegen schreiben wir die ReadLine-Methode erst nach dem try-catch-Block, sodass sie auch aufgerufen wird. Der catch-Block kann auch bestimmte Fehler abfangen. Dazu schreibt man in die runden Klammern einen Übergangsparameter mit einem bestimmten Typ wie zum Beispiel Exception oder NullPointerException, usw. "Exception" würde jeden Fehler abfangen, während z.B. "NullPointerException" nur Fehler vom Typ NullPointer abfangen würde. Diese Objekte haben Variablen, die für die Ausgabe der Fehlermeldungen vorhanden sind:

try
{
string content = File.ReadAllText(@"C:\Lesson22\Exampl.txt");
Console.WriteLine(content);
}
catch (Exception ex)
{
Console.WriteLine("Da war ein Problem!");
Console.WriteLine(ex.Message);
}
Console.ReadLine();

Bewegt man die Maus auf die Methode ReadAllText, sieht man unter dem Mauszeiger ein kleines Fenster, welches die Exceptions auflistet. Diese aufgelisteten Exceptions können von der Methode ReadAllText geworfen werden, wenn bestimmte Bedingungen auftreten.

Es können auch mehrere catch-Blöcke existieren. So kann man auf jede Fehlermeldung anders reagieren. Bei der falschen Benennung einer Datei könnte man z.B. einen anderen Text ausgeben als wenn ein Ordner nicht gefunden wurde.

try
{
string content = File.ReadAllText(@"C:\Lesson22\Exampl.txt");
Console.WriteLine(content);
}
catch (FileNotFoundException ex)
{
Console.WriteLine("Da war ein Problem!");
Console.WriteLine("Gehe sicher, dass die Datei richtig benannt ist: Exampl.txt");
}
catch (DirectoryNotFoundException ex)
{
Console.WriteLine("Da war ein Problem!");
Console.WriteLine(@"Gehe sicher, dass der Ordner C:\Lesson22 existiert");
}
catch (Exception ex)
{
Console.WriteLine("Da war ein Problem!");
Console.WriteLine(ex.Message);
}
Console.ReadLine();

Nach dem catch-Block hat man die Möglichkeit einen finally-Block anzuhängen. Dieser Block wird am Ende vom try-catch-Block ausgeführt, egal ob ein Fehler geworfen wurde oder nicht. Häufig wird dieser Block benutzt um Datenbankverbindungen zu schließen oder sonstigem. Da wir in unserem Code nichts dergleichen brauchen, schrieben wir eine Ausgabe in die Konsole:

finally
{
// Code to finalize
// Setting objects to null
// Closing database connections
Console.WriteLine("Closing application now . . .");
}
Console.ReadLine();

Vollständiger Programmcode

class Program
{
static void Main(string[] args)
{
try
{
string content = File.ReadAllText(@"C:\Lesson22\Exampl.txt");
Console.WriteLine(content);
}
catch (FileNotFoundException ex)
{
Console.WriteLine("Da war ein Problem!");
Console.WriteLine("Gehe sicher, dass die Datei richtig benannt ist: Exampl.txt");
}
catch (DirectoryNotFoundException ex)
{
Console.WriteLine("Da war ein Problem!");
Console.WriteLine(@"Gehe sicher, dass der Ordner C:\Lesson22 existiert");
}
catch (Exception ex)
{
Console.WriteLine("Da war ein Problem!");
Console.WriteLine(ex.Message);
}
finally
{
// Code to finalize
// Setting objects to null
// Closing database connections
Console.WriteLine("Closing application now . . .");
}
Console.ReadLine();
}
}