web-dev-qa-db-fra.com

Catching Exception dans la déclaration Using

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?

18
RG-3

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).

22
marc_s

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.

9
Adam Houldsworth
class SqlConnection
{
   using(sqlConnection)
   {

   }
}

class Consumer
{
   try
  {

  }
  catch(SqlException)
  {

  }

}

Il appartient au consommateur de la classe de décider quoi faire avec l'exception.

8
Sandeep

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.

6
Joel Coehoorn

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
    }                
} 
3
Widor

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);
}
2
Matten

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?
}       
0
Jodrell

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.