TRY...CATCH (Transact-SQL)

Implementuje obsługa błędów Transact-SQL przypomina wyjątek w Microsoft Visual C# i Microsoft języków Visual C++.Grupa Transact-SQL sprawozdania mogą być ujęte w do blokTRY.W przypadku wystąpienia błędu w blokTRY, sterowanie jest przekazywane do innej grupy sprawozdania, ujęty w blokCATCH.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

BEGIN TRY
     { sql_statement | statement_block }
END TRY
BEGIN CATCH
     [ { sql_statement | statement_block } ]
END CATCH
[ ; ]

Argumenty

  • sql_statement
    Dowolnego Transact-SQL instrukcja.

  • statement_block
    Każda grupa Transact-SQL instrukcji w partia lub w BEGIN…KONIEC blok.

Uwagi

TRY…Konstrukcja połowu połowy wszystkich błędów wykonywania których ważności wyższym niż 10, który nie jest zamknięcie połączenia bazy danych.

blok TRY musi następować bezpośrednio przez skojarzone CATCH blok.Łącznie z innych sprawozdań między END TRY i instrukcji CATCH rozpocząć generuje błąd składni.

TRY…Konstrukcja połowów nie może obejmować wiele instancji.TRY…Konstrukcja połowów nie może obejmować wiele bloków Transact-SQL instrukcji.Na przykład TRY…Konstrukcja połowów nie może obejmować dwa BEGIN…Bloków końcowych Transact-SQL sprawozdań i nie może obejmować IF…Konstrukcja ELSE.

Jeśli nie wystąpią błędy w kodzie, który jest ujęty w TRY blokpo zakończeniu ostatniego instrukcja w blok TRY, kontroli przekazuje się do instrukcja natychmiast po skojarzone połowu KOŃCA instrukcja.Jeśli występuje błąd w kodzie, który jest ujęty w blokTRY, sterowanie przechodzi do pierwszej instrukcja w skojarzonym połowu blok.Jeśli połowu KOŃCA instrukcja ostatniej instrukcja w procedura składowana lub wyzwalacza, sterowanie jest przekazywane ponownie do instrukcja o nazwie procedura składowana lub opalane wyzwalacza.

Po zakończeniu pracy z kodem w blok CATCH kontroli przekazuje się do instrukcja natychmiast po połowu KOŃCA instrukcja.Błędy spowodowane CATCH blok nie są zwracane do aplikacji wywołującej.Jeżeli jakakolwiek część informacji o błędach muszą zostać zwrócone do aplikacji, kod w blok CATCH należy to zrobić za pomocą mechanizmów, takich jak zestawy wyników wybierz lub instrukcji RAISERROR i Drukuj.Aby uzyskać więcej informacji o instrukcji RAISERROR z TRY…CATCH, zobacz Za pomocą SPRÓBOWAĆ...POŁOWU w języku Transact-SQL.

TRY…CATCH konstrukcje mogą być zagnieżdżane.Do blok TRY lub CATCH blok może zawierać zagnieżdżone TRY…CATCH konstrukcje.Na przykład blok CATCH może zawierać osadzony TRY…CATCH konstrukcja obsługi błędów napotkanych przez kod połowów.

Błędów napotkanych w blok CATCH są traktowane tak, jak błędy generowane wszędzie.Jeśli blok CATCH zawiera zagnieżdżone TRY…Konstrukcja połowu jakichkolwiek błędów w zagnieżdżonych blok TRY będzie przekazać sterowanie do połowu zagnieżdżonego blok.Jeśli nie TRY… zagnieżdżonychKonstrukcja połowu, błąd jest przekazywana z powrotem do obiektu wywołującego.

TRY…WYCHWYTYWANIE błędów połowu nieobsłużony konstrukcje z procedur przechowywanych lub wyzwalacze wykonywane przez kod w blokTRY.Alternatywnie procedur przechowywanych i wyzwalaczy może zawierać własne TRY…POŁÓW konstrukcje obsługi błędów generowanych przez ich kodu.Na przykład do blok TRY wykonuje procedura składowana , gdy wystąpi błąd w procedura składowana, błąd można obsługiwać w następujący sposób:

  • Jeśli procedura składowana nie zawiera własny TRY…Konstrukcja połowu błąd zwraca sterowanie do połowu blok skojarzonych z blok TRY, zawierający instrukcjaEXECUTE.

  • Jeśli procedura składowana zawiera TRY…Konstrukcja połowu błąd przekazuje sterowanie do połowu blok w procedura składowana.Po zakończeniu połowów blok kodu sterowanie jest przekazywane ponownie do instrukcja natychmiast po EXECUTE instrukcja o nazwie procedura składowana.

Instrukcje GOTO nie służy do wprowadzania blokTRY lub CATCH.Instrukcje GOTO służą do przechodzenia do etykiety wewnątrz tej samej TRY lub CATCH blok lub pozostawienie blokTRY lub CATCH.

TRY…CATCH konstrukcja nie używane w zdefiniowanej przez użytkownika funkcja.

Trwa pobieranie informacji o błędzie

W zakres połowu bloknastępujące funkcje systemowe może służyć do uzyskiwania informacji na temat błędu, który spowodował CATCH blok do wykonania:

  • ERROR_NUMBER() zwraca numer błędu.

  • ERROR_SEVERITY() zwraca dotkliwości.

  • ERROR_STATE() zwraca numer stanu błędu.

  • ERROR_PROCEDURE() zwraca nazwę procedura składowana lub wyzwalacz, w którym wystąpił błąd.

  • ERROR_LINE() zwraca numer wiersza wewnątrz procedury, który spowodował błąd.

  • ERROR_MESSAGE() zwraca pełny tekst komunikatu o błędzie.Tekst zawiera wartości dostarczonych parametrów wymiennych, takich jak długość, nazwy obiektów lub godzin.

Funkcje zwracają wartość NULL, jeśli noszą one poza zakres blokCATCH.Informacje o błędach mogą być pobierane za pomocą tych funkcji z dowolnego miejsca w zakres blokCATCH.Na przykład poniższy skrypt zawiera procedura składowana , która zawiera funkcje obsługi błędów.W CATCH blok TRY…CATCH konstrukcji, nosi nazwę procedura składowana i informacji na temat błędu jest zwracany.

USE AdventureWorks2008R2;
GO
-- Verify that the stored procedure does not already exist.
IF OBJECT_ID ( 'usp_GetErrorInfo', 'P' ) IS NOT NULL 
    DROP PROCEDURE usp_GetErrorInfo;
GO

-- Create procedure to retrieve error information.
CREATE PROCEDURE usp_GetErrorInfo
AS
SELECT
    ERROR_NUMBER() AS ErrorNumber
    ,ERROR_SEVERITY() AS ErrorSeverity
    ,ERROR_STATE() AS ErrorState
    ,ERROR_PROCEDURE() AS ErrorProcedure
    ,ERROR_LINE() AS ErrorLine
    ,ERROR_MESSAGE() AS ErrorMessage;
GO

BEGIN TRY
    -- Generate divide-by-zero error.
    SELECT 1/0;
END TRY
BEGIN CATCH
    -- Execute error retrieval routine.
    EXECUTE usp_GetErrorInfo;
END CATCH;

Błędy nie ma wpływu TRY…CATCH konstrukcja

TRY…Konstrukcje CATCH nie stosowane następujące warunki:

  • Ostrzeżenia lub komunikaty informacyjne, których ważności 10 lub niższej.

  • Błędy, które ma wskaźnik ważności, 20 lub wyższym to stop Aparat baz danych programu SQL Server zadania przetwarzania dla sesja.Jeśli wystąpi błąd ma wskaźnik ważności 20 lub wyższej i połączenia bazy danych nie zostanie zakłócone, TRY…POŁÓW obsłuży błąd.

  • Attentions, takie jak klient-przerwanych klient połączeń i żądania przerwań.

  • Podczas sesja jest zakończona przez administrator systemu przy użyciu instrukcja"zabicia".

Następujące typy błędów nie są obsługiwane przez CATCH blok , kiedy występują one na tym samym poziom wykonanie jako TRY…CATCH konstrukcja:

  • Skompiluj błędy, takie jak błędy składni, uniemożliwiające uruchamianie partia .

  • Błędy, które występują podczas instrukcja-poziom ponowną kompilację, takie jak błędy rozpoznawania nazw obiektu, występujące po kompilacji z powodu rozpoznawania nazw odroczonego.

Te błędy są zwracane do poziom uruchomiono partia, procedura składowanalub wyzwalacza.

Jeśli wystąpi błąd podczas kompilacji lub instrukcja-poziom ponowną kompilację na niższym poziom wykonywania (na przykład podczas wykonywania sp_executesql lub zdefiniowane przez użytkownika procedura składowana) wewnątrz TRY blokten błąd występuje na niższym poziom niż TRY…CATCH konstrukcja i będzie obsługiwany przez skojarzony CATCH blok.Aby uzyskać więcej informacji, zobacz Za pomocą SPRÓBOWAĆ...POŁOWU w języku Transact-SQL.

W poniższym przykładzie pokazano, jak błąd rozpoznawania nazwy obiektu generowanych przez SELECT instrukcja nie zostanie przechwycony przez TRY…CATCH konstruowania, ale złowionych przez CATCH blok po takie same SELECT instrukcja jest wykonywane wewnątrz procedura składowana.

USE AdventureWorks2008R2;
GO

BEGIN TRY
    -- Table does not exist; object name resolution
    -- error not caught.
    SELECT * FROM NonexistentTable;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH

Błąd nie zostanie przechwycony i sterowanie przechodzi z TRY…CATCH utworzyć następny wyższy poziom.

Uruchamianie SELECT instrukcja wewnątrz procedura składowana spowoduje błąd występuje na poziom niższym niż TRY blok.Błąd będzie obsługiwany przez TRY…CATCH konstrukcji.

-- Verify that the stored procedure does not exist.
IF OBJECT_ID ( N'usp_ExampleProc', N'P' ) IS NOT NULL 
    DROP PROCEDURE usp_ExampleProc;
GO

-- Create a stored procedure that will cause an 
-- object resolution error.
CREATE PROCEDURE usp_ExampleProc
AS
    SELECT * FROM NonexistentTable;
GO

BEGIN TRY
    EXECUTE usp_ExampleProc;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
  • Aby uzyskać więcej informacji na temat partii, zobacz Partie.

Uncommittable transakcji i XACT_STATE

Jeśli błąd generowane w blok TRY powoduje, że stan bieżącej transakcji do unieważnione, transakcja jest klasyfikowany jako niemożliwy do zatwierdzenia transakcji.Błąd, który zwykle kończy się transakcji poza do blok TRY powoduje, że transakcja wprowadź niemożliwy do zatwierdzenia stan, gdy wystąpi błąd wewnątrz blokTRY.niemożliwy do zatwierdzenia transakcji można wykonywać tylko operacje odczytu albo TRANSAKCJĘ ROLLBACK.Transakcja nie wykonać wszelkie Transact-SQL instrukcji, które powoduje wygenerowanie operacji zapisu lub zatwierdzania transakcji.XACT_STATE, funkcja zwraca wartość -1, jeśli transakcja został sklasyfikowany jako niemożliwy do zatwierdzenia transakcji.Po zakończeniu partia Aparat baz danych wycofuje wszystkie aktywne niemożliwy do zatwierdzenia transakcje.Jeśli nie komunikat o błędzie został wysłany po wprowadzeniu transakcji niemożliwy do zatwierdzenia Państwo, po zakończeniu partia , komunikat o błędzie wysyłany do aplikacji klient .Wskazuje, że niemożliwy do zatwierdzenia wykryto transakcję i wycofane.

Aby uzyskać więcej informacji o niemożliwy do zatwierdzenia transakcji i XACT_STATE funkcja, zobacz Za pomocą SPRÓBOWAĆ...POŁOWU w języku Transact-SQL i XACT_STATE (Transact-SQL).

Przykłady

A.Przy użyciu TRY…CATCH

W poniższym przykładzie SELECT instrukcja , który wygeneruje błąd dzielenia przez zero.Błąd powoduje wykonanie szybkiego dostępu do skojarzonego CATCH blok.

USE AdventureWorks2008R2;
GO

BEGIN TRY
    -- Generate a divide-by-zero error.
    SELECT 1/0;
END TRY
BEGIN CATCH
    SELECT
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO

B.Przy użyciu TRY…POŁOWU w ramach transakcji

W poniższym przykładzie jak TRY…CATCH blok działa wewnątrz transakcji.instrukcja wewnątrz TRYblok generuje błąd naruszenie ograniczenia .

USE AdventureWorks2008R2;
GO
BEGIN TRANSACTION;

BEGIN TRY
    -- Generate a constraint violation error.
    DELETE FROM Production.Product
    WHERE ProductID = 980;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;

    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
END CATCH;

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;
GO

C.Przy użyciu TRY…CATCH z XACT_STATE

Poniższy przykład pokazuje sposób używania TRY…CATCH konstruowania do obsługi błędów, które występują wewnątrz transakcji.XACT_STATE,funkcja Określa, czy transakcja powinna być przekazana lub wycofana. W tym przykładzie SET XACT_ABORT jest ON.Dzięki temu transakcji niemożliwy do zatwierdzenia gdy wystąpi błąd naruszenie ograniczenia .

USE AdventureWorks2008R2;
GO

-- Check to see whether this stored procedure exists.
IF OBJECT_ID (N'usp_GetErrorInfo', N'P') IS NOT NULL
    DROP PROCEDURE usp_GetErrorInfo;
GO

-- Create procedure to retrieve error information.
CREATE PROCEDURE usp_GetErrorInfo
AS
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_LINE () AS ErrorLine
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_MESSAGE() AS ErrorMessage;
GO

-- SET XACT_ABORT ON will cause the transaction to be uncommittable
-- when the constraint violation occurs. 
SET XACT_ABORT ON;

BEGIN TRY
    BEGIN TRANSACTION;
        -- A FOREIGN KEY constraint exists on this table. This 
        -- statement will generate a constraint violation error.
        DELETE FROM Production.Product
            WHERE ProductID = 980;

    -- If the DELETE statement succeeds, commit the transaction.
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    -- Execute error retrieval routine.
    EXECUTE usp_GetErrorInfo;

    -- Test XACT_STATE:
        -- If 1, the transaction is committable.
        -- If -1, the transaction is uncommittable and should 
        --     be rolled back.
        -- XACT_STATE = 0 means that there is no transaction and
        --     a commit or rollback operation would generate an error.

    -- Test whether the transaction is uncommittable.
    IF (XACT_STATE()) = -1
    BEGIN
        PRINT
            N'The transaction is in an uncommittable state.' +
            'Rolling back transaction.'
        ROLLBACK TRANSACTION;
    END;

    -- Test whether the transaction is committable.
    IF (XACT_STATE()) = 1
    BEGIN
        PRINT
            N'The transaction is committable.' +
            'Committing transaction.'
        COMMIT TRANSACTION;   
    END;
END CATCH;
GO