OBSŁUGA BŁĘDÓW: ERROR MESSAGE, RAISERROR, TRY I CATCH, THROW

Kursy Online SQL Server Bazy Danych Microsotf Obsługa Błędów Error Message ErrorMessage Raiserror Try Catch Throw Andrzej Śmigielski

ERROR MESSAGE

 
          ERROR MESSAGE to podstawowa, najprostsza forma informowania przez SQL Server o wystąpieniu wyjątku.
 

Składowe ERROR MESSAGE:

ERROR NUMBER / Message Id Identyfikator błędu z tabeli systemowej sys.messages.
Błędy o ID <= 50000 to błędy systemowe.
Błędy o ID > 50000 to błędy zdefiniowane przez użytkownika.
ERROR SEVERITY Oznacza ważność błędu, która może być w przedziale od 0 do 25:
0-10: informacje lub ostrzeżenie (WARNING)
11-16: Błąd programistyczny
17-25: Błędy zasobowe, sprzętowe, systemowe, serwerowe
20-25: Zakończenie połączeń
Błędy w przedziale 19-25 mogą zostać spowodowane tylko przez administratorów, użytkowników z uprawnieniami SysAdmin.
ERROR STATE Oznacza kod stanu błędu, pozwalający na jego lokalizację w kodzie źródłowym.
Zakres wartości to od 1 do 127.
ERROR PROCEDURE Wskazuję nazwę obiektu (procedury, funcji), w którym wystąpił błąd.
Jeżeli błąd powstał w zwykłej kwerendzie, to miejsce będzie puste.
ERROR LINE Linia w ciele kodu, w którym wystąpił błąd.
ERROR MESSAGE Opis błędu.

 
Można definiować własne błędy oraz je usuwać za pomocą procedur:
● sp_addmessage – dodaje błąd
● sp_dropmessage – usuwa błąd
 

Identyfikacja błędu w kodzie SQL:
W oknie „Messages” widocznym na poniższym zrzucie z ekranu można zidentyfikować położenie błędu w kodzie SQL za pomocą podwójnego kliknięcia (dwukliku) na błędzie:

Programowanie SQL Bazy Danych Obsługa Błędów Error Message Raiserror Try Catch Throw

 
 

RAISERROR

 
          RAISERROR pozwala na przechwycenie informacji o wystąpieniu błędu w kodzie SQL i dalszym postępowaniu względem tego błędu.
 

Składowe RAISERROR:

ERROR MESSAGE Opis błędu.
ERROR SEVERITY Oznacza ważność błędu, która może być w przedziale od 0 do 25:
0-10: informacje lub ostrzeżenie (WARNING)
11-16: Błąd programistyczny
17-25: Błędy zasobowe, sprzętowe, systemowe, serwerowe
20-25: Zakończenie połączeń
Błędy w przedziale 19-25 mogą zostać spowodowane tylko przez administratorów, użytkowników z uprawnieniami SysAdmin.
ERROR STATE Oznacza kod stanu błędu, pozwalający na jego lokalizację w kodzie źródłowym.
Zakres wartości to od 1 do 127.
Istnieje możliwość zwrócenia stanu o wartości 0, więc warto o tym pamiętać i sprawdzać przed przekazaniem do RAISERROR’a.

 
 

TRY i CATCH

 
          TRY i CATCH jest to struktura, blok kodu pozwalający na przechwycenie i obsługę błędów.
Jeżeli w bloku TRY wystąpi błąd, to automatycznie zostanie on przeniesiony do bloku CATCH, gdzie mamy możliwość jego obsługi. Jeżeli natomiast w bloku TRY nie wystąpi żaden wyjątek to blok CATCH nie zostanie wykonany.

Bloki te otwiera się i zamyka poleceniami BEGIN oraz END:
          BEGIN TRY
                    …
          END TRY
          BEGIN CATCH
                    …
          END CATCH

W blokach TRY i CATCH mamy możliwość przechwycenia wszystkich składowych błędów za pomocą funkcji:
ERROR_NUMBER()
ERROR_MESSAGE()
ERROR_SEVERITY()
ERROR_STATE()
ERROR_LINE()
ERROR_PROCEDURE()
 
 

THROW

 
          THROW jest to polecenie podobne do RAISERROR, także pozwala na przechwycenie informacji o wystąpieniu błędu w kodzie SQL i dalszym postępowaniu względem tego błędu. Jest to nowsze rozwiązanie i producent, czyli Microsoft zaleca używanie właśnie tej składni, która jest mniej skomplikowana od RAISERROR.

RAISERROR i THROW są podobne, jak wcześniej napisałem, więc nie są tożsame, różnice w sposobie działania pokazane są w skrypcie.

Dodatkowe „drobne” różnice między RAISERROR i THROW:
W RAISERROR przechwytujemy wartość ważności, natomiast w THROW ustawiony jest na sztywno i zawsze zwraca wartość równą 16.
W RAISERROR błąd zwrócony z ID > 50000 w przypadku braku definicji w tabeli systemowej sys.messages zgłosi kolejny wyjątek, natomiast THROW zadziała.
 
 

PLIKI DO ŚCIĄGNIĘCIA:

1. 009_Obsluga_Bledow.sql
 

KURSY SQL ONLINE