Laden...

Eigene Exception - Richtige Anwendung

Erstellt von plongo vor 18 Jahren Letzter Beitrag vor 18 Jahren 5.638 Views
P
plongo Themenstarter:in
123 Beiträge seit 2006
vor 18 Jahren
Eigene Exception - Richtige Anwendung

Hallo,

ich habe mir für meine Datenbankklasse, ebenfalls eine eigene Exception-Klasse geschrieben. Sieht wie folgt aus:


        public class DatabaseException : Exception {
            public DatabaseException() :
                base("Fehler aufgetreten innerhalb der Datenbankklasse.") {}

            public DatabaseException(string message) :
                base(message) {}

            public DatabaseException(string message, Exception innerException) :
                base(message, innerException) { }
        } // DatabaseException

Innerhalb meiner Datenbankklasse:


		public class Database : IDisposable {
			public Database() {
				try {
					// Property setzen
                    _databaseEngine = (DbEngine)Convert.ToInt32(ConfigurationManager.AppSettings.Get("ACCESS.DATABASE_ENGINE"));
					_connString = ConfigurationManager.AppSettings.Get("ACCESS.DATABASE_CONNSTRING");
                    _count = 0;

				} catch (Exception err) {
                    Library.Err.FileLog(err, "Database", "System.Access.Database");
                    throw new DatabaseException(err.ToString(), err);
				}
			} // Database
.
.
.
}

Falls jetzt im catch-Block eine Fehler auftritt, wird dieses dann protokolliert. Desweiteren wird dann die eigene DatabaseException geworfen!

Damit möchte ich erreichen, das wenn ich meine Datenbankklasse in einer Methode\Funktion benutze, wo ich natürlich mit try-catch Block arbeite, dort dann die auf diese Exception reagieren kann.


publiv void blabla() {
  try {
    // tue irgendeine Db-Operation

  } catch(Access.DatabaseException err) {
     Library.Err.FileLog(err, "RecordCount", "System.Library.Database", sCommandText);
  } catch (Exception err) {
     Library.Err.FileLog(err, "RecordCount", "System.Library.Database", sCommandText);
  }
}

Mein Problem bisher war, das bei einen Fehler in der DB-Klasse, dies zwar protokolliert wurde, aber ich nicht der Anwendung drauf reagieren konnte. Z..b möchte in meiner WebApp. den Benutzer auf eine Fehlerseite schicken!

P.S: Suche benutzt, aber nichts brauchbares gefunden!

Gruss plongo


Woher soll ich wissen, was ich denke, bevor ich höre, was ich sage!
Kurzum: Läufer sind gesünder, "gescheiter" und glücklicher als Nichtläufer.
www.andreas-nicole.de

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo plongo,

sind das nicht zwei Fragen?

  1. Habe ich meine DatabaseException korrekt/sinnvoll implmentiert?
    Ich würde sagen ja.

  2. Wir kann ich als Reaktion auf eine Exception den Benutzer auf eine Fehlerseite schicken?
    Wenn das deine Hauptfrage ist, würde ich den Thread mal nach "Web- und Netzwerktechnologien" verschieben.

herbivore

P
plongo Themenstarter:in
123 Beiträge seit 2006
vor 18 Jahren

Hallo,

erstmal danke für deine Antwort.

1.
OK!

2.
Ich möchte damit erreichen die Exception weiterzugeben! Denn bisher war es so das, wenn ein Fehler innerhalb der Database-Klasse aufgetreten ist, diese zwar protokolliert wurde, aber der Benutzer Meldung bekommen habe. Ist ja auch klar, da ich bisher in der Fehlerbehandung in der Database-Klasse keine Vorkehrungen getroffen habe und dort hat nicht machen kann. Dort habe ich ja nur protokolliert.

Jetzt wollte ich eben duch meine eigene Exception erreichen, das wenn ich meine Databease-Klasse verwende und dort nun ein Fehler auftritt, eben dies über diese eigene (Database)Exception abfangen kann.

Nochmal ein kleines Beispiel:


public void GetAllUser() {
	try {
		System.Access.Database oDb = new System.Access.Database();

		// Verbindun zur DB!
		oDb.Open();

                // Daten holen
		oDb.CommandText = "SELECT * FOM USER";
                System.Data.SqlClient.SqlDataReader oDReader = oDb.ExecuteReader();
		
		// Daten durchlaufen
		while (oDReader.Read()) {
			..
			..
		}

		// Schliessen
		oDReader.Close();
		oDb.Close();	

	} catch(System.Acccess.DatabaseException err) {
		// Fehler protokollieren und User meldung geben
		// Fehler in der Databank-Klasse
	} catch(System.Exception err) {
		// Fehler protokollieren und User meldung geben
	}
}

Wie du siehst ist der Commandtext ein Syntaxfehler drin "FOM". Wenn ich dies nur ausführe, erhalte ich eine Exception in meiner DB-klasse. Und genau diese Excepton möchte durch meine eigene weitergeben!

Geht das so wie ich dies gemacht habe?
Ist dies so richtig implementiert?
Habe ich diese so richtig im catch-Block abgefangen?

Danke & Gruss

Gruss plongo


Woher soll ich wissen, was ich denke, bevor ich höre, was ich sage!
Kurzum: Läufer sind gesünder, "gescheiter" und glücklicher als Nichtläufer.
www.andreas-nicole.de

B
249 Beiträge seit 2005
vor 18 Jahren

Halloo

Du könntest z.B. eine UserException machen in der du als InnerException deine DatabaseException mitgibst. du logst also im catch block und wirfst nach dem logging gleich einen neue UserException.

Irgendwo in deiner Applikation wo du GetAllUser aufrufst hast du einen zentralen Exceptionhandler über "alles". Da kannst du dann entscheiden was du mit der UserException machst.

bzw. wieso hast du einen methode GetAllUser ohne Rückgabewert??

P
plongo Themenstarter:in
123 Beiträge seit 2006
vor 18 Jahren

Halo bubblez,

danke für deine Antwort...

ich muss mir erst mal deine Antwort richtig durchlesen und auf meine klassen umzudenken. Meld mich nochmal.

nicht falsch verstehen, die GetAllUser ist nur eine Beispiel-methode gewesen. diese habe ich nicht im Einsatz. Aber dennoch danke für den Hinweis!!!! 😉

edit:
Ok versteh ich das richtig.

Beispiel (dies hab ich auch in Anwendung):


namespace System {
	namespace Library {
          public class LibraryException : Exception {
            public LibraryException() :
                base("Fehler aufgetreten.") {}
            
            public LibraryException(string message) :
                base(message) {}
            
            public LibraryException(string message, Exception innerException) :
                base(message, innerException) { }
        }

		public static class Err {
            public static void FileLog(Exception errFunc, string errFunction, string errClass) {
                try {
                    FileLog(errFunc, errFunction, errClass, "-");

                } catch (Exception err) {
                    EventLog oEvLog = new EventLog();
                    oEvLog.Log = "Application";
                    oEvLog.Source = "Application";
                    oEvLog.WriteEntry(err.ToString(), EventLogEntryType.Error);
                }
            } // FileLog
        } // Err
     } // Library
} // System

----

namespace System {
	namespace Library {
		public class Database {
			public static int RecordCount(string sCommandText) {
				try {
					if (Library.General.Nz(sCommandText, true) == false) {
						// Deklaration - Objekte
						Access.Database oDatabase = new Access.Database();
						DbDataReader oDReader;
						int iCount;

                        			// DbEngine
                        			setDbEngine();

						// Oeffnen
                       				 oDatabase.DatabaseEngine = _databaseEngine;
                        			oDatabase.ConnectionString = _connString;
						oDatabase.Open();
						
						// Zaehler zuruecksetzen
                       				 oDatabase.CommandText = sCommandText;
						oDReader = oDatabase.ExecuteReader();
                        			iCount = oDatabase.Count;
				
						// Schliessen
						oDReader.Close();
						oDatabase.Close();
						
						// Zuruecksetzen
                       				 return iCount;
					
					// ansonsten
					} else {
						return 0;
					}
	
               			} catch(Access.DatabaseException err) {
                		    Library.Err.FileLog(err, "RecordCount", "System.Library.Database", sCommandText);
				} catch (Exception err) {
                		    Library.Err.FileLog(err, "RecordCount", "System.Library.Database", sCommandText);
               			     throw new Library.LibraryException(err.ToString(), err);
				}

               			return 0;
			} //RecordCount
        	} // Database
	} // Library
} // System

Gruss plongo


Woher soll ich wissen, was ich denke, bevor ich höre, was ich sage!
Kurzum: Läufer sind gesünder, "gescheiter" und glücklicher als Nichtläufer.
www.andreas-nicole.de

P
plongo Themenstarter:in
123 Beiträge seit 2006
vor 18 Jahren

Hallo,

ich wollte nur mal mitteilen, da mein Exception - Abfang so wunderbar funktioniert.

Danke füre eure Hilfe!

Gruss plongo


Woher soll ich wissen, was ich denke, bevor ich höre, was ich sage!
Kurzum: Läufer sind gesünder, "gescheiter" und glücklicher als Nichtläufer.
www.andreas-nicole.de