Zum Inhalt springen

Typ der Exception auswerten


Empfohlene Beiträge

Geschrieben (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 von mcn
Geschrieben

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.

Geschrieben (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 :P

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 von mcn
...da war was. Wer es findet darf es behalten!
Geschrieben

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?

Geschrieben (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

  1. bei _exception.Data.GetType()
    per _exception.Data.GetType().ToString() == "System.IO.FileNotFoundException" argumentieren, was
  2. in meinen Augen, in Bezug auf den string, ziemlich Fehleranfällig ist, weswegen ich
  3. 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 von mcn
Muss sowas immer einen Grund haben?

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...