Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Gestione degli errori di SQL Server:eccezioni e contratto database-client

Bene, sono una scimmia del codice client che si occupa molto di database. Ecco come lo gestisco.

Le eccezioni (raiseerror) che si verificano in SQL vengono propagate al chiamante. Ciò includerebbe vincoli di riferimento, violazioni dell'indice univoco, problemi più seri, ecc. Fondamentalmente tutto ciò che non farebbe verificarsi normalmente l'operazione sui dati dovrebbe essere propagato indietro.

Il C# chiamante dovrebbe avere questo:

catch (SQLException sqlEx)

E quindi gestisci l'eccezione secondo necessità. Dovrebbero avere un gestore SQLException specifico. Questo è importante.

In genere sto lontano dai parametri di output perché li considero correlati ai dati trasportati e non a messaggi di errore, inoltre posso controllare l'eccezione per il codice di errore di SQL Server in modo che tutti i dati di cui abbiamo bisogno dovrebbero essere in quell'eccezione.

Inoltre, in alcuni casi con SQL Server, abbiamo stored procedure che potrebbero generare "eccezioni di tipo aziendale". In questi casi aggiungiamo un numero di errore personalizzato (sopra 50000) e innalziamo quell'errore nella procedura memorizzata quando necessario. In generale cerchiamo di mantenerli al minimo perché aggiunge complessità, ma in alcuni casi li abbiamo trovati necessari.

Ora, poiché il client sta rilevando SQLException, può esaminare il codice di errore restituito da SQL Server nell'eccezione e quindi eseguire qualsiasi azione speciale (se necessario) quando l'eccezione viene rilevata e il numero di errore è un determinato valore. Ciò consente un livello secondario di gestione degli errori basato sul codice di errore, se necessario per gli errori personalizzati (>50000).

Ciò consente inoltre ai DBA di generare errori personalizzati e fare in modo che il codice client abbia un modo coerente per gestirli. I DBA dovrebbero quindi dire alla scimmia del codice client quali erano gli errori personalizzati in modo da potersi preparare.

Di solito non uso i codici di ritorno per scopi di gestione degli errori, anche se posso vedere come potrebbero essere usati, ma ciò significa più logica nel livello della scimmia del codice per guardare e gestire il codice di ritorno. Se sono un problema, voglio indietro un'eccezione, perché così posso affrontarli in modo coerente. Se devo guardare anche ai codici di ritorno, ora ci sono più strade per la gestione degli errori.