Je sais que Using statement élimine l'objet en cours de création. Comme si je voulais faire quelque chose comme ça:
Using(SqlConnection conn = new SqlConnection(connString))
{
//some code
//How to show the users if conn is not opened up or generated some kind of error?
}
Comment montrer aux utilisateurs si conn n'est pas ouvert ou a généré une sorte d'erreur?
Il n'y a rien de spécial dans le code écrit dans un bloc using
- utilisez simplement un try.catch
pour gérer les exceptions:
using(SqlConnection conn = new SqlConnection(connString))
{
try
{
conn.Open();
// do more stuff here......
}
catch(SqlException sqlEx)
{
// log error and possibly show to user in a MessageBox or something else
}
}
Le bloc using(...) { ... }
lui-même est conçu seulement pour s’assurer que la ressource/l’objet qu’elle "encapsule" est correctement éliminée quand elle n’est plus nécessaire. Vous ne pouvez rien faire avec l'instruction using
elle-même pour lui permettre de gérer les erreurs.
Donc, si vous vous attendez à ce que la création de l’objet échoue, vous devez alors insérer tout le bloc using
à l’intérieur du bloc try ... catch
ou revenir à un bloc try ... catch ... finally
et vous assurer de vous en débarrasser correctement (comme Adam l’a suggéré dans sa réponse).
using
n'offre pas de porte dérobée dans catch
.
Développez-le simplement manuellement (cela ne sert à rien d'avoir le try/catch à l'intérieur de l'IMO utilisant):
SqlConnection conn = null;
try
{
conn = new SqlConnection("");
}
catch ...
{
}
finally
{
if (conn != null)
conn.Dispose();
}
Je préfère cela plutôt que de placer la using
dans un try-catch
ou d'incorporer un try-catch
dans la using
la plupart du temps pour éviter que le code ne se retrouve avec un try-catch
imbriqué une fois compilé. Si vous ne devez couvrir qu'un très petit sous-ensemble d'un gros morceau de code dans une using
, cependant, je serais plus granulaire et l'intégrerais.
class SqlConnection
{
using(sqlConnection)
{
}
}
class Consumer
{
try
{
}
catch(SqlException)
{
}
}
Il appartient au consommateur de la classe de décider quoi faire avec l'exception.
Comme d'autres réponses l'ont indiqué, il suffit d'ajouter un essai/capture normal.
Cependant, j’ajouterais que c’est le mauvais endroit où mettre ceci/attraper, surtout si votre objectif est de "montrer aux utilisateurs" un message. Laissez l'exception se produire à ce niveau et laissez-la bouillonner pour former un code mieux à même de savoir comment y répondre.
En d'autres termes, laissez votre exemple de code tel qu'il est. N'ajoutez rien de nouveau ... à cette méthode . Mais peut-être que le code qui appelle cette méthode devrait réfléchir à la façon de gérer une exception ... toute exception ... de la base de données.
Juste de la manière habituelle:
Non plus
try
{
using(SqlConnection conn = new SqlConnection(connString))
{
//some code
}
}
catch (Exception exc)
{
//handle error
}
ou
using(SqlConnection conn = new SqlConnection(connString))
{
try
{
//some code
}
catch (Exception exc)
{
//handle error
}
}
C’est la même chose que vous feriez sans.
using(SqlConnection conn = new SqlConnection(connString))
{
try{
//some code
}
catch(SqlException e)
MessageBox.Show(e.Message);
}
Vous ne le faites pas dans la using
try
{
using(SqlConnection conn = new SqlConnection(connString))
{
// Some code for when "conn" is succesfully instantiated
}
}
catch (SomeSpecificConnectionInstantiationException ex)
{
// Use ex to handle a bizarre instantiation exception?
}
Lorsque vous incorporez le bloc using () à l'intérieur d'un try/catch, le bloc using () garantira en effet que Dispose est appelé. Cependant, si du code non géré n'importe où dans votre bloc using lève une exception, using () le mangera simplement et il n'atteindra pas votre cible. Utilisez try/catch dans le bloc using (), sautez using () et effectuez try/catch/finally, ou utilisez la syntaxe étrange "using () try" avec un bloc catch (ce qui vous laisse un nombre impair de crochets et de est susceptible de confondre le diable des programmeurs de niveau intermédiaire qui le rencontrent plus tard.