Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analysplattformssystem (PDW)
SQL-analysslutpunkt i Microsoft Fabric
Lager i Microsoft Fabric
SQL-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).