Usando RAISERROR con THROW per lanciare un errore di sistema SQL Server

postato in: Articles | 0

THROW sostituisce RAISERROR in SQL Server ed è il metodo preferito che va avanti per generare messaggi di errore e spingerli al codice chiamante. THROW è in realtà molto più intuitivo di RAISERROR per quanto riguarda il modo in cui il tuo codice risponde ad esso.

THROW è stato creato come mezzo per abbinare più da vicino il codice di gestione degli errori negli attuali linguaggi di programmazione. RAISERROR è in circolazione dal 1998, rilasciato per la prima volta in SQL Server 7.0., THROW è stato incluso per la prima volta in SQL Server 2012.

RAISERROR è ancora incluso nelle versioni correnti di SQL Server, ma ci sono notevoli differenze tra il modo in cui scorre SQL quando viene chiamato RAISERROR e quando viene chiamato THROW. In particolare, RAISERROR non interrompe l’esecuzione della procedura corrente, mentre THROW interrompe sempre la procedura corrente e passa l’errore fino alla procedura chiamante.

THROW like RAISERROR consente di “generare” errori personalizzati, ma interrompe immediatamente il processo corrente e restituisce l’errore alla procedura di chiamata.,

THROW ti consente di fare praticamente tutto ciò che RAISERROR ha permesso, con una notevole eccezione: THROW non ti consente di generare errori di sistema di SQL Server. Ma se hai bisogno di lanciare un errore di sistema, puoi ancora farlo usando prima RAISERROR in un BLOCCO TRY e usando THROW nel blocco CATCH corrispondente per lanciare l’errore di sistema.

ESEMPIO:

– La seguente istruzione genera un errore perché THROW non può generare eccezioni di sistema:
THROW 40655, ‘ Database master non può essere ripristinato.,’, 1;

RISULTATI:

Msg 35100, Livello 16, Stato 10, Riga 2
Il numero di errore 40655 nell’istruzione THROW è al di fuori dell’intervallo valido. Specificare un numero di errore nell’intervallo valido da 50000 a 2147483647.

Ma puoi aggirare questa limitazione del TIRO di non essere in grado di lanciare eccezioni di sistema usandolo in combinazione con RAISERROR all’interno di un blocco TRY/CATCH:

–Lancia l’eccezione di sistema usando RAISERROR prima in un blocco TRY/CATCH.,
INIZIARE a PROVARE
PRINT ‘Iniziare a Provare’;
RAISERROR (40655, 16, 1);
PRINT ” Fine Prova’;
END TRY

INIZIARE a PRENDERE
PRINT ‘Iniziare a Prendere / Prima di Gettare Errore’;
THROW;
PRINT ‘Fine di Cattura / Dopo il Lancio di Errore’;
FINE di CATTURA;

STAMPA ‘Dopo il Try/Catch’;

i RISULTATI:

Iniziare a Provare
Iniziare a Prendere / Prima di Gettare Errore
Msg 40655, Livello 16, Stato 1, Riga 3
Database “master” non può essere ripristinato.,

Come puoi vedere nei risultati, RAISERROR non interrompe il flusso del processo ma ti consente di aumentare gli errori di sistema e THROW interrompe il flusso del processo e ti permette di lanciare errori di sistema che sollevi con RAISERROR al processo chiamante. Utilizzando le due istruzioni insieme consente di avere il pieno controllo dei messaggi di errore e quando vengono restituiti alla procedura di chiamata.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *