web-dev-qa-db-fra.com

Où dois-je mettre try / catch avec l'instruction "using"?

Duplicata possible:
essayer/attraper + utiliser, bonne syntaxe

J'aimerais try/catch le suivant:

        //write to file
        using (StreamWriter sw = File.AppendText(filePath))
        {
            sw.WriteLine(message);
        }

Dois-je mettre le try/catch blocs à l'intérieur de l'instruction using ou, autour d'elle? Ou les deux?

23
Ryan R

Si votre instruction catch doit accéder à la variable déclarée dans une instruction using, l'intérieur est votre seule option.

Si votre instruction catch a besoin de l'objet référencé dans l'utilisation avant d'être supprimé, l'intérieur est votre seule option.

Si votre déclaration catch prend une action de durée inconnue, comme afficher un message à l'utilisateur, et que vous souhaitez disposer de vos ressources avant que cela ne se produise, alors l'extérieur est votre meilleure option.

Chaque fois que j'ai un scénario similaire à celui-ci, le bloc try-catch est généralement dans une méthode différente plus haut dans la pile d'appels de l'utilisation. Il n'est pas typique pour une méthode de savoir comment gérer les exceptions qui se produisent en son sein comme ceci.

Donc ma recommandation générale est à l'extérieur - très à l'extérieur.

private void saveButton_Click(object sender, EventArgs args)
{
    try
    {
        SaveFile(myFile); // The using statement will appear somewhere in here.
    }
    catch (IOException ex)
    {
        MessageBox.Show(ex.Message);
    }
}
39

Je suppose que c'est la manière préférée:

try
{
    using (StreamWriter sw = File.AppendText(filePath))
    {
        sw.WriteLine(message);
    }
}
catch(Exception ex)
{
   // Handle exception
}
13
CD..

Si vous avez besoin d'un bloc try/catch de toute façon, l'instruction using ne vous achète pas beaucoup. Abandonnez-le et faites-le à la place:

StreamWriter sw = null;
try
{
    sw = File.AppendText(filePath);
    sw.WriteLine(message);
}
catch(Exception)
{
}
finally
{
    if (sw != null)
        sw.Dispose();
}
7
hemp