Dela via


THROW (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

Genererar ett undantag och överför körning till ett CATCH block av ett TRY... CATCH-konstruktion .

Transact-SQL syntaxkonventioner

Syntax

THROW [ { error_number | @local_variable }
    , { message | @local_variable }
    , { state | @local_variable } ]
[ ; ]

Arguments

error_number

En konstant eller variabel som representerar undantaget. Argumentet error_number är int och måste vara större än eller lika med 50 000 och mindre än eller lika med 2 147 483 647.

message

En sträng eller variabel som beskriver undantaget. Meddelandeargumentet är nvarchar(2048).

state

En konstant eller variabel mellan 0 och 255 som anger tillståndet som ska associeras med meddelandet. Argumentet state är tinyint.

Remarks

Använd tillstånd för att identifiera källan till ett fel i din lagrade procedur, utlösare eller instruktionsbatch. Om du till exempel använder samma meddelande på flera platser kan ett unikt tillståndsvärde hjälpa dig att hitta var felet inträffade.

Instruktionen före -instruktionen THROW måste följas av semikolon -instruktionsavslutaren (;).

Om en TRY...CATCH konstruktion inte är tillgänglig avslutas instruktionsbatchen. Radnumret och proceduren där undantaget utlöses anges. Allvarlighetsgraden är inställd på 16.

Om instruktionen THROW anges utan parametrar måste den visas i ett CATCH block. Detta gör att undantaget fångas upp. Eventuella fel som uppstår i en THROW -instruktion gör att instruktionsbatchen avslutas.

% är ett reserverat tecken i meddelandetexten i en THROW -instruktion och måste vara undantagen. % Dubbla tecknet som ska returneras % som en del av meddelandetexten, till exempel 'The increase exceeded 15%% of the original value'.

Skillnader mellan RAISERROR och THROW

I följande tabell visas skillnader mellan RAISERROR och THROW -instruktioner.

RAISERROR statement THROW statement
Om en msg_id skickas till RAISERRORmåste ID:t definieras i sys.messages. Parametern error_number behöver inte definieras i sys.messages.
Parametern msg_str kan innehålla printf formateringsformat. Meddelandeparametern accepterar printf inte formatering.
Allvarlighetsgradsparametern anger allvarlighetsgraden för undantaget. Det finns ingen allvarlighetsgradsparameter . När THROW används för att initiera undantaget är allvarlighetsgraden alltid inställd på 16. Men när THROW används för att återväxa ett befintligt undantag anges allvarlighetsgraden till det undantagets allvarlighetsgrad.
Respekterar inte SET-XACT_ABORT. Transaktioner återställs om SET-XACT_ABORT är ON.

Examples

A. Använda THROW för att skapa ett undantag

I följande exempel visas hur du använder -instruktionen THROW för att skapa ett undantag.

THROW 51000, 'The record does not exist.', 1;

Här är resultatet.

Msg 51000, Level 16, State 1, Line 1
The record does not exist.

B. Använd THROW för att skapa ett undantag igen

I följande exempel visas hur du använder -instruktionen THROW för att skapa det senaste undantaget som utlöstes igen.

USE tempdb;
GO
CREATE TABLE dbo.TestRethrow
(    ID INT PRIMARY KEY
);
BEGIN TRY
    INSERT dbo.TestRethrow(ID) VALUES(1);

--  Force error 2627, Violation of PRIMARY KEY constraint to be raised.
    INSERT dbo.TestRethrow(ID) VALUES(1);
END TRY
BEGIN CATCH

    PRINT 'In catch block.';
    THROW;
END CATCH;

Här är resultatet.

In catch block.
Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK__TestReth__3214EC272E3BD7D3'. Cannot insert duplicate key in object 'dbo.TestRethrow'.
The statement has been terminated.

C. Använda FORMATMESSAGE med THROW

I följande exempel visas hur du använder funktionen FORMATMESSAGE med THROW för att generera ett anpassat felmeddelande. Exemplet skapar först ett användardefinierat felmeddelande med hjälp sp_addmessageav . Eftersom instruktionen THROW inte tillåter ersättningsparametrar i meddelandeparametern på det sätt som gör detRAISERROR, FORMATMESSAGE används funktionen för att skicka de tre parametervärden som förväntas av felmeddelandet .60000

EXEC sys.sp_addmessage
    @msgnum = 60000,
    @severity = 16,
    @msgtext = N'This is a test message with one numeric parameter (%d), one string parameter (%s), and another string parameter (%s).',
    @lang = 'us_english';
GO

DECLARE @msg NVARCHAR(2048) = FORMATMESSAGE(60000, 500, N'First string', N'second string');

THROW 60000, @msg, 1;

Här är resultatet.

Msg 60000, Level 16, State 1, Line 2
This is a test message with one numeric parameter (`500`), one string parameter (First string), and another string parameter (second string).