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.


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow