Szukaj…


Uwagi

TRY / CATCH to konstrukcja językowa specyficzna dla T-SQL MS SQL Server.

Umożliwia obsługę błędów w T-SQL, podobnie jak w kodzie .NET.

Transakcja w TRY / CATCH

Spowoduje to wycofanie obu wstawek z powodu niepoprawnej daty / godziny:

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

Spowoduje to zatwierdzenie obu wstawek:

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

Zgłaszanie błędów w bloku try-catch

Funkcja RAISERROR wygeneruje błąd w bloku TRY CATCH:

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 z drugim parametrem większym niż 10 (11 w tym przykładzie) przerwie wykonywanie w TRY BLOCK i podniesie błąd, który zostanie obsłużony w bloku CATCH. Dostęp do komunikatu o błędzie można uzyskać za pomocą funkcji ERROR_MESSAGE (). Dane wyjściowe tej próbki to:

First statement
Error: Here is a problem!

Podnoszenie wiadomości informacyjnych w try catch catch

RAISERROR o istotności (drugi parametr) mniejszej lub równej 10 nie zgłosi wyjątku.

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

Po instrukcji RAISERROR zostanie wykonana trzecia instrukcja, a blok CATCH nie zostanie wywołany. Wynikiem wykonania jest:

First statement
Here is a problem!
Second statement

Wyjątek dotyczący ponownego generowania wygenerowany przez RAISERROR

Możesz ponownie wyrzucić błąd, który złapiesz w bloku CATCH za pomocą instrukcji TRHOW:

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

Zauważ, że w tym przypadku zgłaszamy błąd ze sformatowanymi argumentami (czwarty i piąty parametr). Może to być przydatne, jeśli chcesz dodać więcej informacji w wiadomości. Wynikiem wykonania jest:

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'

Wyjątek dotyczący rzucania w blokach TRY / CATCH

Możesz rzucić wyjątek w try catch catch:

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

Wyjątek jest obsługiwany w bloku CATCH, a następnie ponownie zgłaszany za pomocą THROW bez parametrów.

First statement
Error: Here is a problem!
Msg 51000, Level 16, State 15, Line 39
Here is a problem!

RZUT jest podobny do RAISERROR z następującymi różnicami:

  • Zaleca się, aby nowe aplikacje korzystały z THROW zamiast RASIERROR.
  • RZUT może użyć dowolnej liczby jako pierwszego argumentu (numeru błędu), RAISERROR może używać tylko identyfikatorów w widoku sys.messages
  • THROW ma wskaźnik ważności 16 (nie można go zmienić)
  • RZUT nie może formatować argumentów takich jak RAISERROR. Użyj funkcji FORMATMESSAGE jako argumentu RAISERROR, jeśli potrzebujesz tej funkcji.


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow