Quale eccezione dovrebbe essere generata quando una query ADO.NET non è in grado di recuperare i dati richiesti?
Domanda
Nel tentativo di aggiungere una convalida dei parametri e una semantica di utilizzo corretta alla nostra applicazione, stiamo provando ad aggiungere la corretta gestione delle eccezioni alle nostre applicazioni .NET.
La mia domanda è questa: quando si generano eccezioni in ADO.NET se una determinata query non restituisce dati o non è stato possibile trovare i dati, quale tipo di eccezione dovrei usare?
psuedocodarlo: (leggi, non esaminare la semantica del codice, so che non verrà compilato)
public DataSet GetData(int identifier)
{
dataAdapter.Command.Text = "Select * from table1 Where ident = " + identifier.toString();
DataSet ds = dataAdapter.Fill(ds);
if (ds.table1.Rows.Count == 0)
throw new Exception("Data not found");
return ds;
}
Soluzione
Le Linee guida MSDN indicano:
-
Prendi in considerazione l'idea di lanciare eccezioni esistenti negli spazi dei nomi di sistema invece di creare tipi di eccezione personalizzati.
-
Crea e genera eccezioni personalizzate se hai una condizione di errore che può essere gestita a livello di codice in modo diverso rispetto a qualsiasi altra eccezione esistente. In caso contrario, genera una delle eccezioni esistenti.
-
Non creare e generare nuove eccezioni solo per avere l'eccezione della tua squadra.
Non esiste una regola rigida e veloce: ma se hai uno scenario per trattare questa eccezione in modo diverso, prendi in considerazione la creazione di un tipo di eccezione personalizzato, come DataNotFoundException come suggerito da Johan Buret .
Altrimenti potresti prendere in considerazione l'idea di lanciare uno dei tipi di eccezione esistenti, come System.Data.DataException o eventualmente System.Collections.Generic.KeyNotFoundException.
Altri suggerimenti
Per quanto riguarda ADO.net, una query che restituisce zero righe non è un errore. Se l'applicazione desidera considerare tale query come un errore, è necessario creare la propria classe di eccezioni ereditando da Eccezione.
public class myException : Exception
{
public myException(string s) : base()
{
this.MyReasonMessage = s;
}
}
public void GetData(int identifier)
{
dataAdapter.Command.Text = "Select * from table1 Where ident = " + identifier.toString();
DataSet ds = dataAdapter.Fill(ds);
if (ds.table1.Rows.Count == 0)
throw new myException("Data not found");
}
Dovresti davvero definire la tua eccezione: DataNotFoundException.
Non dovresti usare la classe base Exception, poiché quando la prenderai nel codice chiamante, scriverai qualcosa come
try
{
int i;
GetData(i);
}
catch(Exception e) //will catch many many exceptions
{
//Handle gracefully the "Data not Found" case;
//Whatever else happens will get caught and ignored
}
Dove solo catturando DataNotFoundEXception otterrai solo il caso che vuoi veramente gestire.
try
{
int i;
GetData(i);
}
catch(DataNotFoundException e)
{
//Handle gracefully the "Data not Found" case;
} //Any other exception will bubble up
Esiste una classe chiamata SqlException, in caso di problemi con il motore SQL ma è meglio non sovraccaricarla con la logica aziendale