Microsoft SQL Server
VERSUCHEN / FANGEN
Suche…
Bemerkungen
TRY / CATCH ist ein für T SQL von MS SQL Server spezifisches Sprachkonstrukt.
Es ermöglicht die Fehlerbehandlung innerhalb von T-SQL, ähnlich wie in .NET-Code.
Transaktion in einem TRY / CATCH
Dadurch werden beide Inserts aufgrund einer ungültigen Datumszeit zurückgesetzt:
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
VALUES (5.2, GETDATE(), 1)
INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
VALUES (5.2, 'not a date', 1)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION -- First Rollback and then throw.
THROW
END CATCH
Dadurch werden beide Einfügungen festgelegt:
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
VALUES (5.2, GETDATE(), 1)
INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
VALUES (5.2, GETDATE(), 1)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
THROW
ROLLBACK TRANSACTION
END CATCH
Fehler beim Try-Catch-Block
Die RAISERROR-Funktion generiert einen Fehler im TRY CATCH-Block:
DECLARE @msg nvarchar(50) = 'Here is a problem!'
BEGIN TRY
print 'First statement';
RAISERROR(@msg, 11, 1);
print 'Second statement';
END TRY
BEGIN CATCH
print 'Error: ' + ERROR_MESSAGE();
END CATCH
RAISERROR mit einem zweiten Parameter größer als 10 (in diesem Beispiel 11) stoppt die Ausführung in TRY BLOCK und löst einen Fehler aus, der im CATCH-Block behandelt wird. Sie können mit der Funktion ERROR_MESSAGE () auf die Fehlernachricht zugreifen. Ausgabe dieses Beispiels ist:
First statement
Error: Here is a problem!
Infomeldungen werden in try catch block ausgelöst
RAISERROR mit einem Schweregrad (zweiter Parameter) kleiner oder gleich 10 löst keine Ausnahme aus.
BEGIN TRY
print 'First statement';
RAISERROR( 'Here is a problem!', 10, 15);
print 'Second statement';
END TRY
BEGIN CATCH
print 'Error: ' + ERROR_MESSAGE();
END CATCH
Nach der RAISERROR-Anweisung wird die dritte Anweisung ausgeführt und der CATCH-Block wird nicht aufgerufen. Ergebnis der Ausführung ist:
First statement
Here is a problem!
Second statement
Erneuter Ausnahmefehler, der von RAISERROR generiert wurde
Sie können Fehler, die Sie im CATCH-Block abfangen, mit der TRHOW-Anweisung erneut werfen:
DECLARE @msg nvarchar(50) = 'Here is a problem! Area: ''%s'' Line:''%i'''
BEGIN TRY
print 'First statement';
RAISERROR(@msg, 11, 1, 'TRY BLOCK', 2);
print 'Second statement';
END TRY
BEGIN CATCH
print 'Error: ' + ERROR_MESSAGE();
THROW;
END CATCH
Beachten Sie, dass in diesem Fall ein Fehler mit formatierten Argumenten (vierter und fünfter Parameter) auftritt. Dies kann nützlich sein, wenn Sie der Nachricht weitere Informationen hinzufügen möchten. Ergebnis der Ausführung ist:
First statement
Error: Here is a problem! Area: 'TRY BLOCK' Line:'2'
Msg 50000, Level 11, State 1, Line 26
Here is a problem! Area: 'TRY BLOCK' Line:'2'
Ausnahme in TRY / CATCH-Blöcken
Sie können in try catch block eine Ausnahme auslösen:
DECLARE @msg nvarchar(50) = 'Here is a problem!'
BEGIN TRY
print 'First statement';
THROW 51000, @msg, 15;
print 'Second statement';
END TRY
BEGIN CATCH
print 'Error: ' + ERROR_MESSAGE();
THROW;
END CATCH
Ausnahme mit im CATCH-Block behandelt werden und dann mit THROW ohne Parameter erneut ausgelöst werden.
First statement
Error: Here is a problem!
Msg 51000, Level 16, State 15, Line 39
Here is a problem!
THROW ähnelt RAISERROR mit folgenden Unterschieden:
- Es wird empfohlen, dass bei neuen Anwendungen THROW anstelle von RASIERROR verwendet wird.
- THROW kann eine beliebige Zahl als erstes Argument (Fehlernummer) verwenden, RAISERROR kann nur IDs in der Sicht sys.messages verwenden
- THROW hat Schweregrad 16 (kann nicht geändert werden)
- THROW kann keine Argumente wie RAISERROR formatieren. Verwenden Sie die Funktion FORMATMESSAGE als Argument von RAISERROR, wenn Sie diese Funktion benötigen.