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
Hallo plongo,
sind das nicht zwei Fragen?
Habe ich meine DatabaseException korrekt/sinnvoll implmentiert?
Ich würde sagen ja.
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
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
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??
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
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