Alex Kuznetsov ha un grande capitolo nel suo libro Defensive Database Programming (Capitolo 8) che tratta T-SQL TRY ... CATCH, le transazioni T-SQL e le impostazioni SET XACT_ABORT e l'utilizzo della gestione degli errori sul lato client. Ti aiuterà molto a decidere quale delle opzioni ha più senso per ciò che devi realizzare.
È disponibile gratuitamente su questo sito . Non sono in alcun modo affiliato con la compagnia, ma possiedo la versione cartacea di quel libro.
Ci sono molti piccoli dettagli su questo argomento che sono spiegati molto bene da Alex.
Per richiesta di Nick ... (ma non tutto questo è nel capitolo)
In termini di ridimensionamento, devi essere brutalmente onesto su quali attività devono essere nel codice db e quali dovrebbero essere nell'app. Hai mai notato quanto il codice ad esecuzione rapida tende a tornare alla progettazione per una singola preoccupazione per metodo?
Il modo più semplice per comunicare sarebbe codici di errore personalizzati (> 50.000). È anche abbastanza veloce. Significa che dovresti mantenere sincronizzati il codice db e il codice dell'app. Con un codice di errore personalizzato, è anche possibile restituire informazioni utili nella stringa del messaggio di errore. Poiché hai un codice di errore strettamente per quella situazione, puoi scrivere un parser nel codice dell'app su misura per il formato dei dati dell'errore.
Inoltre, quali condizioni di errore richiedono un nuovo tentativo di logica nel database? Se vuoi riprovare dopo X secondi, è meglio gestirlo nel codice dell'app in modo che la transazione non si blocchi tanto. Se stai solo reinviando subito un'operazione DML, ripeterla in SP potrebbe essere più efficiente. Tieni presente, tuttavia, che dovrai eventualmente duplicare il codice o aggiungere un livello di SP per eseguire un nuovo tentativo.
Davvero, questo è attualmente il più grande problema con la logica TRY ... CATCH in SQL Server al momento. Può essere fatto, ma è un po 'un gufo. Cercare alcuni miglioramenti a questo proposito in SQL Server 2012, in particolare rilanciando le eccezioni del sistema (preservando il numero di errore originale). Inoltre, c'è FORMATMESSAGE , che aggiunge una certa flessibilità nella costruzione di messaggi di errore, in particolare ai fini della registrazione.