Implementowanie obsługi wyjątków strukturalnych

Ukończone

Teraz, gdy znasz charakter błędów i podstawową obsługę błędów w języku T-SQL, nadszedł czas, aby przyjrzeć się bardziej zaawansowanej formie obsługi błędów. Obsługa wyjątków strukturalnych została wprowadzona w programie SQL Server 2005.

W tym miejscu zobaczysz, jak go używać i ocenić jego zalety i ograniczenia, w tym blok TRY CATCH, rolę funkcji obsługi błędów oraz zrozumieniu różnicy między błędami, które można przechwytywać, a nieprzechwytywalnymi błędami. Na koniec zobaczysz, jak można zarządzać błędami i wyświetlać je w razie potrzeby.

Czym jest programowanie z użyciem bloków TRY/CATCH

Obsługa wyjątków strukturalnych jest bardziej zaawansowana niż obsługa błędów na podstawie zmiennej systemowej @@ERROR. Umożliwia to zapobieganie zaśmiecaniu kodu kodem obsługi błędów i scentralizowanie tego kodu obsługującego błędy. Centralizacja kodu obsługi błędów oznacza również, że można skupić się bardziej na celu kodu, a nie na obsłudze błędów, które zawiera.

Blok TRY i blok CATCH

W przypadku korzystania z obsługi wyjątków strukturalnych kod, który może zgłosić błąd, jest umieszczany w bloku TRY. Bloki TRY są ujęte w instrukcje BEGIN TRY i END TRY .

Jeśli wystąpi błąd umożliwiający przechwycenie — większość błędów może zostać przechwycona, kontrolka wykonywania przechodzi do bloku CATCH. Blok CATCH to seria instrukcji języka T-SQL ujęta w instrukcje BEGIN CATCH i END CATCH .

Uwaga / Notatka

Chociaż instrukcje BEGIN CATCH i END TRY są oddzielnymi instrukcjami, funkcja BEGIN CATCH musi natychmiast postępować zgodnie z instrukcjami END TRY.

Bieżące ograniczenia

Języki wysokiego poziomu często oferują konstrukcję try/catch/finally i są często używane do niejawnego wydawania zasobów. W języku T-SQL nie ma równoważnego bloku FINALLY.

Zrozum różnicę między błędami przechwytywalnymi a nieprzechwytywalnymi.

Należy pamiętać, że chociaż bloki TRY/CATCH umożliwiają przechwycenie znacznie szerszego zakresu błędów niż w przypadku @@ERROR, nie można przechwycić każdego typu.

Przechwytowalne błędy a błędy nieprzechwytowalne

Nie wszystkie błędy mogą być przechwytywane przez bloki TRY/CATCH w ramach tego samego zakresu, w którym występuje blok TRY/CATCH. Często błędy, których nie można przechwycić w tym samym zakresie, mogą być przechwytywane w otaczającym zakresie. Na przykład możesz nie być w stanie uchwycić błędu w procedurze składowanej zawierającej blok TRY/CATCH. Istnieje jednak prawdopodobieństwo, że przechwycisz ten błąd w bloku TRY/CATCH w kodzie, który wywołał procedurę składowaną, w której wystąpił błąd.

Typowe błędy niewychwytywalne

Typowe przykłady błędów nieprzechwytywalnych to:

  • Błędy kompilacji, takie jak błędy składni, które uniemożliwiają kompilowanie serii kodu.
  • Problemy dotyczące ponownej kompilacji na poziomie deklaracji, które zwykle odnoszą się do odroczonego rozpoznawania nazw. Można na przykład utworzyć procedurę składowaną, która odwołuje się do nieznanej tabeli. Błąd jest zgłaszany tylko wtedy, gdy procedura próbuje rozwiązać nazwę tabeli do objectid.

Jak ponownie wywrócić błędy przy użyciu funkcji THROW

Jeśli instrukcja THROW jest używana w bloku CATCH bez żadnych parametrów, spowoduje to ponowne wywołanie błędu, który spowodował wprowadzenie bloku CATCH. Za pomocą tej techniki można zaimplementować rejestrowanie błędów w bazie danych, przechwytując błędy i rejestrując ich szczegóły, a następnie zgłaszając oryginalny błąd do aplikacji klienckiej, aby można je było tam obsłużyć.

Oto przykład ponownego zgłoszenia błędu.

BEGIN TRY
    -- code to be executed
END TRY
BEGIN CATCH
    PRINT ERROR_MESSAGE();
    THROW
END CATCH

W niektórych wcześniejszych wersjach programu SQL Server nie było metody zgłaszania błędu systemu. Chociaż THROW nie może określić błędu systemowego do zgłoszenia, gdy THROW jest używane bez parametrów w bloku CATCH, ponownie zgłosi zarówno błędy systemowe, jak i użytkowników.

Co to są funkcje obsługi błędów

Bloki CATCH udostępniają informacje związane z błędami przez cały czas trwania bloku CATCH. Obejmuje to podzakresy, takie jak procedury składowane, uruchamiane w ramach bloku CATCH.

Funkcje obsługi błędów

Należy pamiętać, że podczas programowania z @@ERROR wartość przechowywana przez zmienną systemową @@ERROR została zresetowana zaraz po wykonaniu następnej instrukcji.

Kolejną kluczową zaletą obsługi wyjątków strukturalnych w języku T-SQL jest to, że udostępniono szereg funkcji obsługi błędów i zachowano ich wartości w bloku CATCH. Oddzielne funkcje zapewniają każdą właściwość błędu, który został zgłoszony.

Oznacza to, że można napisać ogólne procedury obsługi błędów składowanych, które nadal mogą uzyskiwać dostęp do informacji związanych z błędami.

  • Bloki CATCH udostępniają informacje związane z błędami przez cały czas trwania bloku CATCH.
  • @@Error jest resetowany po uruchomieniu następnej instrukcji.

Zarządzanie błędami w kodzie

Integracja środowiska SQL CLR umożliwia wykonywanie kodu zarządzanego w programie SQL Server. Języki platformy .NET wysokiego poziomu, takie jak C# i VB, mają szczegółową obsługę wyjątków. Błędy można przechwycić przy użyciu standardowych bloków try/catch/finally platformy .NET.

Błędy w kodzie zarządzanym

Ogólnie rzecz biorąc, możesz chcieć przechwytywać błędy w kodzie zarządzanym, na tyle, na ile to możliwe. Należy jednak pamiętać, że wszystkie błędy, które nie są obsługiwane w kodzie zarządzanym, są przekazywane z powrotem do wywołującego kodu T-SQL. Za każdym razem, gdy wystąpi błąd w kodzie zarządzanym i zostanie zwrócony do programu SQL Server, będzie traktowany jako błąd 6522. Błędy mogą być zagnieżdżone, a ten konkretny błąd może ukrywać rzeczywistą przyczynę błędu.

Kolejną rzadką, ale możliwą przyczyną błędów w kodzie zarządzanym jest to, że kod może wykonać instrukcję T-SQL RAISERROR za pośrednictwem obiektu SqlCommand.