BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki

Baza wiedzy











Porada: Klauzula THROW w SQL Server 2012

16-05-2012 13:41 | Michał Derendarz
Artykuł opisuje najważniejsze kwestie dotyczące korzystania z klauzuli THROW w SQL Server 2012

W SQL Server 2012 została wprowadzona klauzula THROW.

Klauzula THROW służy do podniesienia wyjątku. Gdy zostanie napotkana, wykonywany zostaje kod znajdujący się w bloku CATCH albo wyjątek zostaje wyrzucony do wyższej warstwy(wywołującej).

Składnia klauzuli THROW wygląda następująco:

THROW [ { numer_błędu }, { wiadomość }, { stan }] [ ; ]

Numer błędu jest liczbą całkowitą typu int z przedziału [50000; 2147483647]. Wiadomość może reprezentować dowolny napis typu nvarchar(2048), natomiast stan dowolną liczbą tinyint.

Klauzuli THROW można używać bezparametrowo jedynie w bloku CATCH.  Wszędzie indziej wartości numeru błędu, wiadomość oraz stan muszą być zadeklarowane(bezpośrednio lub za pomocą zmiennych).

Oczywiście, we wcześniejszych wersjach SQL Server wyjątki można było programowo podnosić za pomocą funkcji RAISERROR. W najnowszej wersji możliwe są już jednak 2 sposoby: funkcja RAISERROR oraz klauzula THROW.

Głównym celem wprowadzenia klauzuli THROW jest przyspieszenie i uproszczenie pisania kodu. W porównaniu do funkcji RAISERROR, numer błędu przekazany jako parametr do klauzuli nie musi być zdefiniowany w tabeli sys.messages.  Dodatkowo poziom błędu zawsze wynosi 16(błąd, który może zostać naprawiony przez użytkownika), nie jest definiowalny tak jak w funkcji RAISERROR.

Klauzula THROW jest zatem szczególnie przydatna przy wyrzucaniu błędów, które może obsłużyć użytkownik.

Poniżej prosty przykład pokazujący sposób korzystania z klauzuli THROW oraz kilku podstawowych funkcji służących do raportowania  i obsługi błędów SQL Server 2012:

 

declare @liczba int;
print 'Zmienna @liczba musi mieć wartość większą od 10!';

begin try
print 'Blok TRY'
set @liczba = 9;
if @liczba<10 
	throw 50000, 'Podałeś liczbę mniejszą od 10',1;  
print 'Wszystkie instrukcje w bloku TRY zakończone sukcesem';
end try

begin catch
print 'Blok CATCH'
declare 
	@linia_z_błędem int,
	@wiadomość nvarchar(4000),
	@numer_błędu int, 
	@poziom_błędu tinyint,
	@stan_błędu tinyint;

select @linia_z_błędem = ERROR_LINE() , 
	@wiadomość = ERROR_MESSAGE(),
	@numer_błędu = ERROR_NUMBER(), 
	@poziom_błędu = ERROR_SEVERITY(), 
	@stan_błędu = ERROR_STATE();

print Concat('Linia z błędem: ', @linia_z_błędem);
print Concat('Wiadomość: ', @wiadomość);
print Concat('Numer błędu: ', @numer_błędu);
print Concat('Poziom błędu: ', @poziom_błędu);
print Concat('Stan błędu: ', @stan_błędu);

throw 60000, 'Wyrzucam błąd na zewnątrz',1;

print 'Koniec bloku CATCH'
end catch
print 'Koniec skryptu';


Oto wynik działania powyższego skryptu:

Wynik działania instrukcji THROW

Jak widać wystąpienie instrukcji THROW powoduje natychmiastowe przejście do bloku CATCH lub całkowite wyrzucenie błędu(w powyższym przypadku to zakończenie wykonywania skryptu).

Polecam zapoznanie się ze szczegółami na stronie MSDN.

Źródło: MSDN: THROW

Komentarze 0

pkt.

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.