Behandeln von Fehlern
Bei der Verwendung des Microsoft JDBC-Treibers für SQL Server werden alle Datenbankfehlerbedingungen als Ausnahmen unter Verwendung der Klasse SQLServerException an Ihre Java-Anwendung zurückgegeben. Die folgenden Methoden der SQLServerException-Klasse werden von „java.sql.SQLException“ und „java.lang.Throwable“ geerbt. Mit ihnen können spezielle Informationen zum aufgetretenen SQL Server-Fehler zurückgegeben werden:
getSQLState()
gibt den normalen X/Open- oder SQL99-Statuscode der Ausnahme zurück.getErrorCode()
gibt die jeweilige Datenbankfehlernummer zurück.getMessage()
gibt den vollständigen Text der Ausnahme zurück. Der Text der Fehlermeldung beschreibt das Problem und enthält häufig Platzhalter für Informationen wie Objektnamen, die in die angezeigte Fehlermeldung eingefügt werden.getSQLServerError()
gibt dasSQLServerError
-Objekt zurück, das ausführliche von SQL Server empfangene Informationen zur Ausnahme enthält. Diese Methode gibt NULL zurück, wenn kein Serverfehler aufgetreten ist.
Die folgenden Methoden der SQLServerError
-Klasse können zum Abrufen zusätzlicher Informationen über den Fehler verwendet werden, der vom Server generiert wurde.
SQLServerError.getErrorMessage()
gibt die vom Server empfangene Fehlermeldung zurück.SQLServerError.getErrorNumber()
gibt eine Zahl zurück, die zur Identifikation des Fehlertyps dient.SQLServerError.getErrorState()
gibt einen numerischen Fehlercode von SQL Server zurück, der einen Fehler, eine Warnung oder die Meldung „no data found“ (Keine Daten gefunden) darstellt.SQLServerError.getErrorSeverity()
gibt den Schweregrad des Fehlers zurück.SQLServerError.getServerName()
gibt den Namen des Computers zurück, auf dem die SQL Server-Instanz ausgeführt wird, die den Fehler generiert hat.SQLServerError.getProcedureName()
gibt den Namen der gespeicherten Prozedur oder des Remoteprozeduraufrufs zurück, der den Fehler generiert hat.SQLServerError.getLineNumber()
gibt die Zeilennummer im Transact-SQL-Befehlsbatch oder in der gespeicherten Prozedur zurück, die den Fehler generiert hat.
Im nächsten Beispiel wird eine offene Verbindung mit der SQL-AdventureWorks2022-Beispieldatenbank an die Funktion übergeben und eine fehlerhafte SQL-Anweisung erstellt, die keine FROM-Klausel enthält. Anschließend wird die Anweisung ausgeführt, und eine SQL-Ausnahme wird verarbeitet.
public static void executeSQLException(Connection con) {
try (Statement stmt = con.createStatement();) {
String SQL = "SELECT TOP 10 * Person.Contact";
ResultSet rs = stmt.executeQuery(SQL);
while (rs.next()) {
System.out.println(rs.getString("FirstName") + " " + rs.getString("LastName"));
}
}
catch (SQLException se) {
do {
System.out.println("SQL STATE: " + se.getSQLState());
System.out.println("ERROR CODE: " + se.getErrorCode());
System.out.println("MESSAGE: " + se.getMessage());
System.out.println();
}
while (se != null);
}
}
Verwenden des ServerMessageHandler
Ab Version 12.8.0 verfügt der Treiber über einen zusätzlichen ServerMessageHandler
, was eine größere Kontrolle über das Fehlerfeedback und die Fehlerprotokollierung erlaubt. Zur Nutzung des ServerMessageHandler
muss die ISQLServerMessageHandler
-Schnittstelle implementiert werden. Zu den Features des ServerMessageHandler
gehören:
Nachrichtenfeedback
Damit erhalten Sie Feedback von Abfragen mit langer Ausführungszeit (z. B. Fortschrittsmeldungen). Beispiel: RAISERROR ('Progress message...', 0, 1) WITH NOWAIT
.
Universelle Fehlerprotokollierung
Ermöglicht dem Meldungshandler die Protokollierung aller Fehler.
Universelle Fehlerbehandlung
Ermöglicht Ihnen das Platzieren von Fehlerbehandlungslogik nur mit ServerMessageHandler
, anstatt die gleiche Fehlerbehandlung in der gesamten Anwendung zu wiederholen.
Neuzuordnen des Schweregrads von Fehlermeldungen
Hiermit können Sie den Schweregrad bestimmter Fehlermeldungen erkennen und ändern:
SQLServerError.toSQLServerInfoMessage()
gibt eineISQLServerMessage
zurück, die durch das Herabstufen einer Fehlermeldung auf eine Infomeldung erstellt wurde.SQLServerError.toSQLServerInfoMessage(int newErrorSeverity)
gibt eineISQLServerMessage
zurück, die durch das Herabstufen einer Fehlermeldung auf eine Infomeldung erstellt wurde – mit einem neuen Fehlerschweregrad.SQLServerError.toSQLServerInfoMessage(int newErrorSeverity, int newErrorNumber)
gibt eineISQLServerMessage
zurück, die durch das Herabstufen einer Fehlermeldung auf eine Infomeldung erstellt wurde – mit einem neuen Fehlerschweregrad und einer neuen Fehlernummer.SQLServerInfoMessage.toSQLServerError()
gibt eineISQLServerMessage
zurück, die durch das Hochstufen einer Infomeldung auf eine Fehlermeldung erstellt wurde.SQLServerInfoMessage.toSQLServerError(int newErrorSeverity)
gibt eineISQLServerMessage
zurück, die durch das Hochstufen einer Infomeldung auf eine Fehlermeldung erstellt wurde – mit einem neuen Fehlerschweregrad.SQLServerInfoMessage.toSQLServerError(int newErrorSeverity, int newErrorNumber)
gibt eineISQLServerMessage
zurück, die durch das Hochstufen einer Infomeldung auf eine Fehlermeldung erstellt wurde – mit einem neuen Fehlerschweregrad und einer neuen Fehlernummer.
SQLExceptionChaining
Außerdem können ab Version 12.8.0 SQLExceptions miteinander verkettet werden, sodass die endgültige Ausnahmemeldung automatisch alle Ausnahmen enthält, die andernfalls möglicherweise verloren gegangen wären. Dieses Feature ist standardmäßig aktiviert.