używanie RAISERROR z THROW do wyrzucenia błędu systemu SQL Server

wpis w: Articles | 0

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

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *