mcn Geschrieben 20. Juni 2012 Geschrieben 20. Juni 2012 (bearbeitet) Tach die Damen und Herren, habe da ein kleines Problem. Erstmal der Quellcode zum Problem: Eine Klasse zum laden und speichern von Informationen: namespace Kontixx_v_000 { /// <summary> /// Stellt Methoden zum laden und speichern von Konfigurationseinstellungen bereit. /// </summary> class Persistent { public static KontixxObjects.[COLOR="blue"]SqlServerConfig[/COLOR] LoadConfig(string _filename = "config.dat") { System.IO.FileStream fileStream = new System.IO.FileStream(_filename, System.IO.FileMode.Open, System.IO.FileAccess.Read); System.Runtime.Serialization.Formatters.Binary.BinaryFormatter binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); KontixxObjects.SqlServerConfig config = ([B]KontixxObjects[/B].[COLOR="blue"]SqlServerConfig[/COLOR])binaryFormatter.Deserialize(fileStream); fileStream.Close(); return config; } } } Und hier der Aufruf der Methode: private void frmDatenquelle_Load(object sender, EventArgs e) { try { KontixxObjects.[COLOR="blue"]SqlServerConfig[/COLOR] config = Persistent.LoadConfig(); } catch (System.IO.FileNotFoundException ex) { ExceptionHandling(ex); } } private void ExceptionHandling(Exception _exception) { if (_exception.Data.GetType() == typeof(System.IO.FileNotFoundException)) { MessageBox.Show("Die Konfigurationsdatei wurde nicht gefunden. " + "", "Fehler beim laden der Konfiguration", MessageBoxButtons.OK, MessageBoxIcon.Error); } } SqlServerConfig stellt hier einfach ein serialisierbares Objekt dar welches vier string-Variablen samt Getter und Setter endhält. So, nun mein Problem: Da die Datei nicht existiert wird eine Exception ausgelöst. Soweit ok, soll ja auch. Nur, warum wird in der Methode private void ExceptionHandling(Exception _exception) der IF-Block nicht ausgeführt? Denn folgender Aufruf würde ein Ausführen des IF-Blocks veranlassen: /// <summary> /// Stellt Methoden zum laden und speichern von Konfigurationseinstellungen bereit. /// </summary> class Persistent { public static [COLOR="blue"]DataTable[/COLOR] LoadConfig(string _filename = "config.dat") { DataTable dataTable = new DataTable(); dataTable.ReadXML(_filename); return dataTable; } } Tjo... ...Dank an dieser Stelle im Voraus. m. Bearbeitet 20. Juni 2012 von mcn Zitieren
a3quit4s Geschrieben 21. Juni 2012 Geschrieben 21. Juni 2012 Nimm das is-Schluesselwort um den Typen zu vergleichen. Mir ist allerdings schleierhaft wieso du explizit die FileNotFoundException faengst, um dann einen generellen ExceptionHandler aufzurufen der wieder den Typen prueft. Zitieren
mcn Geschrieben 21. Juni 2012 Autor Geschrieben 21. Juni 2012 (bearbeitet) Hiho, schön. Dacht ich mir guckst du mal... und siehe da! Mir ist allerdings schleierhaft wieso du explizit die FileNotFoundException faengst, um dann einen generellen ExceptionHandler aufzurufen der wieder den Typen prueft. Du, manchmal musst du tun was du tun musst An diesem Punkt, zu jenem Zeitpunkt, war es die einzige verbliebene Möglichkeit sicher zu gehen dass eine FileNotFound-Exception ausgelöst wurde. Denn die wurde zware bis an frmDatenquelle_Load weitergeleitet. Allerdings in ExceptionHandling nicht korrekt ausgewertet. Bissl umständlich an dieser Stelle, aber letzte Nacht das letzte Mittel (und auch schon sehr spät). Aber hey, if (_exception is System.IO.FileNotFoundException) { MessageBox.Show("Die Konfigurationsdatei wurde nicht gefunden. " + "", "Fehler beim laden der Konfiguration", MessageBoxButtons.OK, MessageBoxIcon.Error); } ...das funktioniert Interessieren tut es mich trotzdem. Wieso funktioniert das mit is nicht aber per ...GetData().GetType() == ...? Weil, wie beschrieben: Wenn ich eine XML-Datei per DataTable.ReadXML lesen wollte die nicht existiert, dann würde die Exception korrekt ausgewertet und der IF-Block ausgeführt werden. Falls sich hier also noch eine Antwort finden täte. Ich wäre da sehr dankbar. greetz m. Bearbeitet 21. Juni 2012 von mcn ...da war was. Wer es findet darf es behalten! Zitieren
mepp Geschrieben 21. Juni 2012 Geschrieben 21. Juni 2012 So wie ich die Sache sehe willst du eigentlich den _exception.GetType() und nicht den von _exception.Data.GetType()... .Data enthält doch nur Key/Value Paare mit Zusatzinformation? Zitieren
mcn Geschrieben 21. Juni 2012 Autor Geschrieben 21. Juni 2012 (bearbeitet) So wie ich die Sache sehe willst du eigentlich den _exception.GetType() und nicht den von _exception.Data.GetType()... [...] Ist schon recht. Nur müsste ich bei _exception.Data.GetType() per _exception.Data.GetType().ToString() == "System.IO.FileNotFoundException" argumentieren, wasin meinen Augen, in Bezug auf den string, ziemlich Fehleranfällig ist, weswegen ich lieber per IntelliSense (ich weiß, ich weiß: Zucker im A**** - was waren das noch Zeiten... IDE auf DOS mit ohne alles) auf System.IO.FileNotFoundException prüfe. Und naja, ich mag mich wiederholen. Aber wie bereits beschrieben funktioniert das, wie im Problembeitrag gepostet, für die entsprechende Methode, welche dann eine DataTable zurück gegeben hätte. Und das wundert mich halt! Aber die Lösung mit dem is Schlüsselwort/Operator, das ist einfach nur sugar , dank nochmal dafür! An dieser Stelle würde ich das Thema gern ein wenig erweitern. Ich habe eine eigene Klasse eingebunden, die u.a. Methoden enthält. Diese Klasse ist in einem eigenen Projekt entwickelt und als Verweis auf die entsprechende dll eingebunden. Ich würde gern eine Exception, die ,bei einem Aufruf einer Methode dieser Klasse aus dem Hauptprogramm (aus dem dem Klasse referenziert wird), ggf. ausgelöst wird an die aufrufende Methode weiterleiten. Bsp. public class SqlDAL { /// <summary> /// Erzeugt eine neue Instanz /// der Klasse SqlDAL. /// </summary> public SqlDAL() { } /// <summary> /// Destructor. /// </summary> ~SqlDAL() { } /// <summary> /// Erzeugt ein DataTable-Objekt unter Verwendung klassengebundener Verbindungsinformationen. /// </summary> /// <param name="_config">Ein KontixxObjects.SqlServerConfig-Objekt das /// die Verbindungsdaten enthält.</param> /// <returns>DataTable-Objekt mit Informationen /// der vorhandenen Konten.</returns> public System.Data.DataTable GetKontenListe() { return this.GetKontenListe_Execute(); } internal System.Data.DataTable GetKontenListe_Execute() { System.Data.DataTable dataTable; System.Data.SqlClient.SqlCommand sqlCommand; string selCommandText; using (sqlConnection) { selCommandText = @"SELECT * FROM tblKonten;"; using (sqlCommand = new System.Data.SqlClient.SqlCommand(selCommandText, sqlConnection)) { try { dataTable = new System.Data.DataTable(); sqlConnection.Open(); dataTable.Load(sqlCommand.ExecuteReader()); sqlConnection.Close(); return dataTable; } catch (Exception ex) { throw ex; [COLOR="red"]//<== Funktioniert leider nicht. Bleibt im catch-Block hängen.[/COLOR] } finally { } } } } } Wie bekomme ich nun eine Exception, die in dem try-catch-Block ausgelöst wird, an die aufrufende Methode weitergeleitet? private void InitDataGridViev() { try { dgvKontenliste.DataSource = sqlDAL.GetKontenListe(); // Die KontoID ist hier unnötig. dgvKontenliste.Columns["KontoID"].Visible = false; } catch (Exception ex) { this.ExceptionHandling(ex); [COLOR="red"]// Hier hätte ich die Exception gerne hin.[/COLOR] } finally { } } <Hmpf!> Bei (vererbten) Klassen bekomm ich das hin. Hier nicht. Hat vllt. auch hier jmd. Rat? greetz m. p.s. ich hoffe das war/ist jetzt nicht zu viel. Bearbeitet 21. Juni 2012 von mcn Muss sowas immer einen Grund haben? Zitieren
a3quit4s Geschrieben 25. Juni 2012 Geschrieben 25. Juni 2012 Schau dir dazu mal an was Event Bubbling ist und wie das funktioniert. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.