THROW zastępuje RAISERROR w SQL Server i jest to preferowana metoda, która będzie wysyłać komunikaty o błędach i przesyłać je do kodu wywołującego. THROW jest o wiele bardziej intuicyjny niż RAISERROR, jeśli chodzi o to, jak Twój kod na niego reaguje.
THROW został stworzony jako sposób na bliższe dopasowanie kodu obsługi błędów w obecnych językach programowania. RAISERROR istnieje od 1998 roku, po raz pierwszy wydany w SQL Server 7.0., THROW został po raz pierwszy włączony do SQL Server 2012.
RAISERROR jest nadal zawarty w obecnych wersjach SQL Server, ale istnieją znaczące różnice między tym, jak SQL przepływa, gdy wywoływany jest RAISERROR, a kiedy wywoływany jest THROW. W szczególności RAISERROR nie zatrzymuje wykonywania bieżącej procedury, podczas gdy THROW zawsze zatrzymuje bieżącą procedurę i przekazuje błąd do procedury wywołującej.
THROW like RAISERROR pozwala na „podniesienie” własnych błędów, ale natychmiast zatrzymuje bieżący proces i zwraca błąd do procedury wywołania.,
THROW pozwala zrobić prawie wszystko, co RAISERROR dozwolone, z jednym zauważalnym wyjątkiem: THROW nie pozwala na podnoszenie błędów systemu SQL Server. Ale jeśli musisz rzucić błąd systemowy, nadal możesz to zrobić, najpierw używając RAISERROR w bloku TRY I używając THROW in odpowiedniego bloku CATCH, aby wyrzucić błąd systemowy.
przykład:
–poniższe polecenie powoduje błąd, ponieważ THROW nie może wyrzucać WYJĄTKÓW systemowych:
THROW 40655, 'nie można przywrócić bazy danych master.,', 1;
RESULTS:
Msg 35100, Level 16, State 10, Line 2
Numer błędu 40655 w instrukcji THROW jest poza poprawnym zakresem. Określ numer błędu w prawidłowym zakresie od 50000 do 2147483647.
ale możesz obejść to ograniczenie, że nie możesz wyrzucać WYJĄTKÓW systemowych, używając go w połączeniu z RAISERROR w bloku TRY/CATCH:
–wyrzuć wyjątek systemowy, używając RAISERROR najpierw w bloku TRY/CATCH.,
BEGIN TRY
PRINT 'Begin Try';
RAISERROR (40655, 16, 1);
PRINT 'End Try';
END TRY
BEGIN CATCH
PRINT 'Begin Catch / Before Throwing Error';
END CATCH;
Print 'After Try/Catch';
wyniki:
Begin TRY
BEGIN catch/before throwing Error
msg 40655, level 16, State 1, line 3
nie można przywrócić bazy danych 'master'.,
jak widać w wynikach, RAISERROR nie zatrzymuje przepływu procesu, ale pozwala podnosić błędy systemowe, a THROW zatrzymuje przepływ procesu i pozwala rzucać błędy systemowe, które podnosisz za pomocą RAISERROR do procesu wywołującego. Użycie tych dwóch poleceń razem pozwala mieć pełną kontrolę nad komunikatami o błędach i kiedy są one zwracane do procedury wywołującej.
Dodaj komentarz