Microsoft SQL Server
PROVA A PRENDERE
Ricerca…
Osservazioni
TRY / CATCH è un costrutto linguistico specifico per T-SQL di MS SQL Server.
Permette la gestione degli errori all'interno di T-SQL, simile a quella vista nel codice .NET.
Transazione in TRY / CATCH
Ciò ripristinerà entrambi gli inserimenti a causa di un datetime non valido:
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
VALUES (5.2, GETDATE(), 1)
INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
VALUES (5.2, 'not a date', 1)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION -- First Rollback and then throw.
THROW
END CATCH
Questo imposterà entrambi gli inserti:
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
VALUES (5.2, GETDATE(), 1)
INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
VALUES (5.2, GETDATE(), 1)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
THROW
ROLLBACK TRANSACTION
END CATCH
Aumentare gli errori nel blocco try-catch
La funzione RAISERROR genera un errore nel blocco TRY CATCH:
DECLARE @msg nvarchar(50) = 'Here is a problem!'
BEGIN TRY
print 'First statement';
RAISERROR(@msg, 11, 1);
print 'Second statement';
END TRY
BEGIN CATCH
print 'Error: ' + ERROR_MESSAGE();
END CATCH
RAISERROR con secondo parametro maggiore di 10 (11 in questo esempio) interrompe l'esecuzione in TRY BLOCK e genera un errore che verrà gestito nel blocco CATCH. È possibile accedere al messaggio di errore utilizzando la funzione ERROR_MESSAGE (). L'output di questo campione è:
First statement
Error: Here is a problem!
Aumentare i messaggi di informazione nel try catch block
RAISERROR con severità (secondo parametro) minore o uguale a 10 non genererà eccezioni.
BEGIN TRY
print 'First statement';
RAISERROR( 'Here is a problem!', 10, 15);
print 'Second statement';
END TRY
BEGIN CATCH
print 'Error: ' + ERROR_MESSAGE();
END CATCH
Dopo l'istruzione RAISERROR, verrà eseguita la terza istruzione e il blocco CATCH non verrà richiamato. Il risultato dell'esecuzione è:
First statement
Here is a problem!
Second statement
Rilanciare l'eccezione generata da RAISERROR
È possibile ripetere l'errore che si cattura nel blocco CATCH utilizzando l'istruzione TRHOW:
DECLARE @msg nvarchar(50) = 'Here is a problem! Area: ''%s'' Line:''%i'''
BEGIN TRY
print 'First statement';
RAISERROR(@msg, 11, 1, 'TRY BLOCK', 2);
print 'Second statement';
END TRY
BEGIN CATCH
print 'Error: ' + ERROR_MESSAGE();
THROW;
END CATCH
Si noti che in questo caso si genera un errore con argomenti formattati (quarto e quinto parametro). Questo potrebbe essere utile se vuoi aggiungere più informazioni nel messaggio. Il risultato dell'esecuzione è:
First statement
Error: Here is a problem! Area: 'TRY BLOCK' Line:'2'
Msg 50000, Level 11, State 1, Line 26
Here is a problem! Area: 'TRY BLOCK' Line:'2'
Eccezione di lancio nei blocchi TRY / CATCH
Puoi lanciare un'eccezione nel try catch block:
DECLARE @msg nvarchar(50) = 'Here is a problem!'
BEGIN TRY
print 'First statement';
THROW 51000, @msg, 15;
print 'Second statement';
END TRY
BEGIN CATCH
print 'Error: ' + ERROR_MESSAGE();
THROW;
END CATCH
Eccezione con essere gestita nel blocco CATCH e quindi re-generata con il comando LANCIO senza parametri.
First statement
Error: Here is a problem!
Msg 51000, Level 16, State 15, Line 39
Here is a problem!
THROW è simile a RAISERROR con le seguenti differenze:
- La raccomandazione è che le nuove applicazioni debbano utilizzare THROW anziché RASIERROR.
- THROW può usare qualsiasi numero come primo argomento (numero di errore), RAISERROR può usare solo id nella vista sys.messages
- THROW ha gravità 16 (non può essere modificato)
- THROW non può formattare argomenti come RAISERROR. Usa la funzione FORMATMESSAGE come argomento di RAISERROR se ti serve questa funzione.