je travaillais avec une petite routine qui est utilisé pour créer une connexion de base de données:
Avant
public DbConnection GetConnection(String connectionName)
{
ConnectionStringSettings cs= ConfigurationManager.ConnectionStrings[connectionName];
DbProviderFactory factory = DbProviderFactories.GetFactory(cs.ProviderName);
DbConnection conn = factory.CreateConnection();
conn.ConnectionString = cs.ConnectionString;
conn.Open();
return conn;
}
Puis j'ai commencé à chercher dans la .NET framework documentation, pour voir ce qui l' a documenté le comportement de diverses choses sont, et de voir si je peux les manipuler.
Par exemple:
ConfigurationManager.ConnectionStrings...
La documentation indique que l'appel ConnectionStrings jette un ConfigurationErrorException si elle n'a pas pu récupérer la collection. Dans ce cas, il n'y a rien que je peux faire pour gérer cette exception, donc je vais le laisser aller.
La prochaine partie est l'indexation de la ConnectionStrings pour trouver nomconnexion:
...ConnectionStrings[connectionName];
Dans ce cas, le ConnectionStrings la documentation dit que la propriété renvoie la valeur null si le nom de connexion n'a pas pu être trouvé. je peux vérifier ce qui se passe, et de lever une exception de laisser quelqu'un d'en haut qu'ils ont donné une invalide nomconnexion:
ConnectionStringSettings cs=
ConfigurationManager.ConnectionStrings[connectionName];
if (cs == null)
throw new ArgumentException("Could not find connection string \""+connectionName+"\"");
je le répète le même exercice avec:
DbProviderFactory factory =
DbProviderFactories.GetFactory(cs.ProviderName);
Le GetFactory méthode n'a pas de documentation sur ce qui se passe si une usine pour l' ProviderName
ne pouvait pas être trouvé. Ce n'est pas documentée pour revenir null
, mais je peux toujours être sur la défensive, et de vérifier pour les nuls:
DbProviderFactory factory =
DbProviderFactories.GetFactory(cs.ProviderName);
if (factory == null)
throw new Exception("Could not obtain factory for provider \""+cs.ProviderName+"\"");
Suivante est la construction de la DbConnection objet:
DbConnection conn = factory.CreateConnection()
De nouveau, la documentation ne dit pas ce qui se passe s'il ne pourrait pas créer une connexion, mais encore une fois je peux vérifier pour un retour null objet:
DbConnection conn = factory.CreateConnection()
if (conn == null)
throw new Exception.Create("Connection factory did not return a connection object");
Suivant est la définition d'une propriété de l'objet de Connexion:
conn.ConnectionString = cs.ConnectionString;
Les docs ne pas dire ce qui se passe si on ne peut pas définir la chaîne de connexion. Est-il lever une exception? Est-il l'ignorer? Comme avec la plupart des exception, s'il y avait une erreur lors de la tentative de définition de la ConnectionString d'une connexion, il n'y a rien que je peux faire pour la récupérer. Je vais donc ne rien faire.
Et enfin, l'ouverture de la connexion de base de données:
conn.Open();
La méthode Ouverte de DbConnection est abstrait, c'est donc jusqu'à ce que le fournisseur est décroissant à partir de DbConnection de décider quelles sont les exceptions qu'ils jettent. Il n'y a également aucune indication dans le résumé des méthodes Ouvertes de la documentation sur ce que je peux attendre si il y a une erreur. Si il y avait une erreur lors de la connexion, je sais que je ne peut pas gérer elle - je vais devoir laisser de bulle où l'appelant peut montrer certains de l'INTERFACE utilisateur pour l'utilisateur, et laissez-les essayer de nouveau.
Après
public DbConnection GetConnection(String connectionName)
{
//Get the connection string info from web.config
ConnectionStringSettings cs= ConfigurationManager.ConnectionStrings[connectionName];
//documented to return null if it couldn't be found
if (cs == null)
throw new ArgumentException("Could not find connection string \""+connectionName+"\"");
//Get the factory for the given provider (e.g. "System.Data.SqlClient")
DbProviderFactory factory = DbProviderFactories.GetFactory(cs.ProviderName);
//Undefined behaviour if GetFactory couldn't find a provider.
//Defensive test for null factory anyway
if (factory == null)
throw new Exception("Could not obtain factory for provider \""+cs.ProviderName+"\"");
//Have the factory give us the right connection object
DbConnection conn = factory.CreateConnection();
//Undefined behaviour if CreateConnection failed
//Defensive test for null connection anyway
if (conn == null)
throw new Exception("Could not obtain connection from factory");
//Knowing the connection string, open the connection
conn.ConnectionString = cs.ConnectionString;
conn.Open()
return conn;
}
Résumé
Donc ma ligne de quatre la fonction, est devenu de 12 lignes, et de 5 mintues de la documentation de recherche. En fin de compte je l'ai fait attraper l'un des cas où une méthode est autorisé à retourner la valeur null. Mais, dans la pratique, j'ai tout convertir une exception de violation d'accès (si je tente d'appeler des méthodes sur une référence null) dans un InvalidArgumentException.
j'ai aussi attraper les deux cas, il pourrait être null retour des objets; mais encore une fois je ne négocié une exception pour l'autre.
Sur le côté positif, il n'a attraper deux problèmes, et d'expliquer ce qui s'est passé dans le message de l'exception, plutôt que de mauvaises choses qui se passe en bas de la route (c'est à dire le mâle s'arrête ici)
Mais est-il utile? Est-ce exagéré? Est-ce une programmation défensive qui a mal tourné?