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.


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow