Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Analytics-eindpunt in Microsoft Fabric
Magazijn in Microsoft Fabric
SQL-database in Microsoft Fabric Preview
Genereert een uitzondering en draagt de uitvoering over naar een blok van een CATCHTRY... CATCH-constructie .
Transact-SQL syntaxis-conventies
Syntax
THROW [ { error_number | @local_variable }
, { message | @local_variable }
, { state | @local_variable } ]
[ ; ]
Arguments
error_number
Een constante of variabele die de uitzondering vertegenwoordigt. Het argument error_number is int en moet groter dan of gelijk zijn aan 50.000 en kleiner dan of gelijk aan 2.147.483.647.
message
Een tekenreeks of variabele die de uitzondering beschrijft. Het berichtargument is nvarchar(2048).
state
Een constante of variabele tussen 0 en 255 die de status aangeeft die aan het bericht moet worden gekoppeld. Het argument status is klein.
Remarks
Gebruik de status om u te helpen bij het identificeren van de bron van een fout in uw opgeslagen procedure, trigger of instructiebatch. Als u bijvoorbeeld hetzelfde bericht op meerdere plaatsen gebruikt, kunt u met een unieke statuswaarde vinden waar de fout is opgetreden.
De instructie vóór de THROW instructie moet worden gevolgd door de afsluiter van de puntkomma (;).
Als een TRY...CATCH constructie niet beschikbaar is, wordt de instructiebatch beëindigd. Het regelnummer en de procedure waarin de uitzondering wordt gegenereerd, worden ingesteld. De ernst is ingesteld op 16.
Als de THROW instructie zonder parameters is opgegeven, moet deze worden weergegeven in een CATCH blok. Dit zorgt ervoor dat de gevangen uitzondering wordt gegenereerd. Als er een fout optreedt in een THROW instructie, wordt de instructiebatch beëindigd.
% is een gereserveerd teken in de berichttekst van een THROW instructie en moet worden ontsnapt. Dubbel het % teken dat moet worden geretourneerd % als onderdeel van de berichttekst, bijvoorbeeld 'The increase exceeded 15%% of the original value'.
Verschillen tussen RAISERROR en THROW
De volgende tabel bevat verschillen tussen de RAISERROR en THROW instructies.
| RAISERROR statement | THROW statement |
|---|---|
Als een msg_id wordt doorgegeven RAISERROR, moet de id worden gedefinieerd in sys.messages. |
De parameter error_number hoeft niet te worden gedefinieerd in sys.messages. |
De parameter msg_str kan opmaakstijlen bevatten printf . |
De berichtparameter accepteert printf geen stijlopmaak. |
| De ernstparameter geeft de ernst van de uitzondering aan. | Er is geen ernstparameter . Wanneer THROW wordt gebruikt om de uitzondering te initiëren, wordt de ernst altijd ingesteld op 16. Wanneer THROW echter wordt gebruikt om een bestaande uitzondering opnieuw te werpen, wordt de ernst ingesteld op het ernstniveau van die uitzondering. |
| Houdt niet rekening met SET XACT_ABORT. | Transacties worden teruggedraaid als SET XACT_ABORT is ON. |
Examples
A. THROW gebruiken om een uitzondering te genereren
In het volgende voorbeeld ziet u hoe u de THROW instructie gebruikt om een uitzondering te genereren.
THROW 51000, 'The record does not exist.', 1;
Hier is het resultatenoverzicht.
Msg 51000, Level 16, State 1, Line 1
The record does not exist.
B. THROW gebruiken om een uitzondering opnieuw te genereren
In het volgende voorbeeld ziet u hoe u de THROW instructie gebruikt om de laatst gegenereerde uitzondering opnieuw te genereren.
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;
Hier is het resultatenoverzicht.
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. FORMATMESSAGE gebruiken met THROW
In het volgende voorbeeld ziet u hoe u de functie FORMATMESSAGE gebruikt om THROW een aangepast foutbericht te verzenden. In het voorbeeld wordt eerst een door de gebruiker gedefinieerd foutbericht gemaakt met behulp van sp_addmessage. Omdat de THROW instructie geen vervangingsparameters in de berichtparameter toestaat zoals dat RAISERROR wel het geval is, wordt de FORMATMESSAGE functie gebruikt om de drie parameterwaarden door te geven die worden verwacht door een foutbericht 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;
Hier is het resultatenoverzicht.
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).