2008-09-23 4 views
1

Pour tenter d'ajouter une validation de paramètre et une sémantique d'utilisation correcte à notre application, nous essayons d'ajouter une gestion correcte des exceptions à nos applications .NET.Quelle exception doit être levée lorsqu'une requête ADO.NET ne peut pas récupérer les données demandées?

Ma question est la suivante: Lorsque vous lancez des exceptions dans ADO.NET si une requête particulière ne renvoie aucune donnée ou si les données n'ont pas pu être trouvées, quel type d'exception dois-je utiliser?

psuedocode: (lu, ne pas examiner la sémantique du code, je sais que ce ne sera pas compilé)

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; 
} 

Répondre

7

L'état MSDN guidelines:

  • envisager de lancer les exceptions existantes résidant dans les espaces de noms System au lieu de créer des types d'exception personnalisés. Créez et lancez des exceptions personnalisées si vous avez une condition d'erreur qui peut être gérée par programme d'une manière différente de toutes les autres exceptions existantes. Sinon, lancez l'une des exceptions existantes. Ne créez pas et ne lancez pas de nouvelles exceptions uniquement pour avoir l'exception de votre équipe.

Il n'y a pas de règle stricte: mais si vous avez un scénario pour traiter cette exception différemment, pensez à créer un type d'exception personnalisée, comme DataNotFoundException as suggested by Johan Buret.

Sinon, vous pouvez envisager de lancer l'un des types d'exception existants, tels que System.Data.DataException ou éventuellement System.Collections.Generic.KeyNotFoundException.

2

En ce qui concerne ADO.net, une requête qui renvoie zéro lignes n'est pas une erreur. Si votre application souhaite traiter une telle requête comme une erreur, vous devez créer votre propre classe d'exception en héritant de Exception.

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"); 
} 
+1

Hérite de ApplicationException, la classe recommandée par Microsoft pour dériver des exceptions personnalisées. – icelava

+0

Plus: "Vous devriez dériver des exceptions personnalisées de la classe Exception plutôt que la classe ApplicationException Vous ne devriez pas lancer une exception ApplicationException dans votre code, et vous ne devriez pas attraper une exception ApplicationException sauf si vous avez l'intention de relancer l'exception originale " -http: //msdn.microsoft.com/en-us/library/system.applicationexception%28v=vs.110%29.aspx – jcmcbeth

2

Vous devriez vraiment définir votre propre exception: DataNotFoundException.

Vous ne devriez pas utiliser l'exception de la classe de base, étant donné que lorsque vous attraperez en appelant le code, vous allez écrire quelque chose comme

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 
} 

Où que la capture que votre DataNotFoundEXception ne recevra que le cas où vous voulez vraiment manipuler.

try 
{ 
    int i; 
    GetData(i); 

} 
catch(DataNotFoundException e) 
{ 
    //Handle gracefully the "Data not Found" case; 
} //Any other exception will bubble up 

Il y a une classe bien nommée SqlException, quand il y a des problèmes avec le moteur SQL, mais il est préférable de ne pas surcharger votre logique métier

Questions connexes