Quale eccezione dovrebbe essere generata quando una query ADO.NET non è in grado di recuperare i dati richiesti?

StackOverflow https://stackoverflow.com/questions/121700

  •  02-07-2019
  •  | 
  •  

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;
}
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top