Gestire nelle winapplication gli errori verificatisi durante l'esecuzi...

giovedì 13 marzo 2008 - 15.05

liuc Profilo | Junior Member

Vi illustro prima lo scenario e poi faccio la domanda.



In un database abbiamo due tabelle : Ruoli e Utenti. La logica dell'applicazione dice che per eliminare un ruolo non devono esserci utenti ad esso associati.

Una stored si occupa della cancellazione di un ruolo; riceve in input l'id dell'oggetto da cancellare.
Nella stored vengono fatti una serie di controlli quali :
a) verificare che il dato esista nella tabella e in caso contrario ritornare un codice di errore (10)
b) verificare che non esistano utenti associati al ruolo da cancellare (in caso contrario restituisci un codice di errore 20)
c) se si sono verificati errori durante l'update della tabella ritorna un codice di errore ancora diverso (30).

Tale stored viene eseguita da un webservice.

Qual'è il modo migliore per gestire all'interno dell'applicazione chiamante gli errori (eventuali)rilevati durante l'esecuzione della stored ?

In questo momento i vengono in mente le seguenti soluzioni :

a) aggiungere due parametri di output ad ogni stored nel db che restituiscano rispettivamente il codice e il messaggio dell'errore. Tali valori sarebbero accessibili tramite due appositi parametri (reference) associati al webservice invocato.

b) restituire codice e messaggio con una select da eseguire come ultima istruzione della stored ; in quersto modo però (correggetemi se sbaglio) dovrei fa restituire un dataset da ciscnu metodo (nel webservice) in cui l'ultima tabella dovrebbe contenere le informazioni sull'eventuale errore

Non mi entusiasmano molto (soprattutto la seconda), ma oggi non mi viene di meglio. Voi che suggerite ?

rossimarko Profilo | Guru

Ciao,

secondo me dipende dalle esigenze che hai sul client.
Potresti farti tornare come parametro di ritorno della funzione un enum con due valori:
- RecordNonPresente
- DatiReferenziati
e gestire nell'applicazione che chiama il webservice questo parametro.

Per ogni altro errore potresti pensare di generare un'eccezione nel tuo webservice. In questo modo sul client avresti una routine di questo tipo:
//WebService TestSiteWS.WSProva ws = new TestSite.TestSiteWS.WSProva(); string strRisultato = string.Empty; try { //Chiamata a webservice TestSiteWS.FunctionResult risultato = ws.EliminaRuolo(2); if (risultato == TestSiteWS.FunctionResult.RecordNonPresente) //Record non presente strRisultato = "Ruolo non presente"; if (risultato == TestSiteWS.FunctionResult.RecordReferenziato) //Record referenziato strRisultato = "Ruolo referenziato"; } catch (Exception ex) { //Errore generico string strError = ex.Message; }

Questo ovviamente facendo alcune considerazioni del tipo:
- le eccezioni si verificano di rado (non è mai bello avere troppe eccezioni in un programma perchè la loro gestione impiega molte risorse). Da quanto ho capito il caso 30 si verifica solo se ci sono anomalie non gestite.
- Non ti interessa avere per i primi 2 casi (10, 20) una descrizione personalizzata

Se invece ti interessa avere oltre al codice di errore anche una descrizione ti consiglio di fare una classe o una struttura da ritornare come risultato del metodo, secondo me è una soluzione più elegante:
public enum CodiceRisultato { RecordNonPresente = 10, RecordReferenziato = 20, ErroreGenerico = 30 } public class Risultato { private CodiceRisultato _Codice; private string _Messaggio; public CodiceRisultato Codice { get { return _Codice; } set { _Codice = value; } } public string Messaggio { get { return _Messaggio; } set { _Messaggio = value; } } } [WebMethod] public Risultato EliminaRuolo(int ID) { Risultato res = new Risultato(); res.Codice = CodiceRisultato.RecordNonPresente; res.Messaggio = "Ruolo non presente"; return res; }

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5