Microsoft SQL Server
PRÓBUJ ZŁAPAĆ
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.