TRY/CATCH gebruiken om SQL Server-fouten af ​​te handelen

click fraud protection

De TRY/CATCH-instructie in Transact-SQL detecteert en verwerkt foutcondities in databasetoepassingen. Deze verklaring is de hoeksteen van SQL Serverfoutafhandeling en is een belangrijk onderdeel van het ontwikkelen van robuuste databasetoepassingen.

TRY/CATCH is van toepassing op SQL Server vanaf 2008, Azure SQL Database, Azure SQL Data Warehouse en Parallel Data Warehouse.

Introductie van TRY/CATCH

TRY./CATCH werkt door twee Transact-SQL-instructies op te geven: een die u wilt "proberen" en een andere om eventuele fouten te "vangen". Wanneer SQL Server een TRY/CATCH-instructie tegenkomt, wordt de instructie in de TRY-clausule onmiddellijk uitgevoerd. Als de TRY-instructie met succes wordt uitgevoerd, gaat SQL Server verder. Als de TRY-instructie echter een fout genereert, voert SQL Server de CATCH-instructie uit om de fout netjes af te handelen.

De basissyntaxis heeft deze vorm:

BEGIN MET PROBEREN
{ sql_statement | instructieblok }
EINDE PROBEREN
BEGIN VANGEN
[ { sql_statement | statement_block } ]
EINDE VANGST
[; ]
instagram viewer

TRY/CATCH Voorbeeld

Overweeg een human resources-database die een tabel bevat met de naam medewerkers, die informatie bevat over elk van de werknemers in een bedrijf. Die tabel gebruikt een integer werknemer-ID-nummer als de hoofdsleutel.

U kunt proberen om onderstaande verklaring te gebruiken om een ​​nieuwe medewerker in uw database in te voegen:

INSERT INTO medewerkers (id, voornaam, achternaam, extensie)
WAARDEN(12497, 'Mike', 'Chapple', 4201)

Onder normale omstandigheden zou deze instructie een rij toevoegen aan de tabel Werknemers. Als er echter al een werknemer met ID 12497 in de database bestaat, zou het invoegen van de rij de primaire-sleutelbeperking schenden en resulteren in de volgende fout:

Msg 2627, niveau 14, staat 1, regel 1
Schending van de PRIMARY KEY-beperking 'PK_employee_id'. Kan geen dubbele sleutel invoegen in object 'dbo.employees'.
De verklaring is beëindigd.

Hoewel deze fout u de informatie geeft die u nodig hebt om het probleem op te lossen, zijn er twee problemen mee. Ten eerste is het bericht cryptisch. Het bevat foutcodes, regelnummers en andere informatie die voor de gemiddelde gebruiker onbegrijpelijk is. Ten tweede, en nog belangrijker, het zorgt ervoor dat de instructie wordt afgebroken en kan een applicatiecrash veroorzaken.

Het alternatief is om de instructie in een TRY...CATCH-instructie in te pakken, zoals hier wordt weergegeven:

BEGIN MET PROBEREN
INSERT INTO werknemers( id, first_name, last_name, extension)
WAARDEN(12497, 'Mike', 'Chapple', 4201)
EINDE PROBEREN
BEGIN VANGEN
PRINT 'FOUT:' + ERROR_MESSAGE( );
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'E-mail van de medewerker',
@ontvangers = '[email protected]',
@body = 'Er is een fout opgetreden bij het aanmaken van een nieuw werknemersrecord.',
@subject = 'Employee Database Error';
EINDE VANGST

In dit voorbeeld worden eventuele fouten gerapporteerd aan zowel de gebruiker die de opdracht uitvoert als het [email protected] e-mailadres. De fout die aan de gebruiker wordt getoond is:

Fout: schending van PRIMARY KEY-beperking 'PK_employee_id'. 
Kan geen dubbele sleutel invoegen in object 'dbo.employees'.
E-mail in de wachtrij.

De uitvoering van de toepassing gaat normaal door, waardoor de programmeur de fout kan afhandelen. Het gebruik van de TRY/CATCH-instructie is een elegante manier om proactief fouten te detecteren en af ​​te handelen die optreden in SQL Server-databasetoepassingen.

Meer leren

Bekijk ons ​​artikel voor meer informatie over de gestructureerde querytaal Grondbeginselen van SQL.

instagram story viewer