119 votes

Utilisez un bloc « try-finally » sans bloc « catch »

Y a-t-il des situations où il est approprié d'utiliser un bloc try-finally sans bloc catch ?

2 votes

Sur MSDN, consultez try-finally (C# Référence). Notez que l'article fait référence à l'utilisation combinée de try et finally comme "try-finally déclaration."

1voto

jazza1000 Points 1463

Voici une situation où vous pourriez vouloir utiliser try finally: lorsque vous utiliseriez normalement une instruction using, mais que vous ne pouvez pas car vous appelez une méthode par réflexion.

Cela ne fonctionnera pas

using (objMsg  =  Activator.CreateInstance(TypeAssist.GetTypeFromTypeName("omApp.MessagingBO")))
{

}

au lieu de cela, utilisez

           object objMsg = null;
            try
            {
                objMsg
                   = Activator.CreateInstance(TypeAssist.GetTypeFromTypeName("myAssembly.objBO"));

                strResponse = (string)objMsg.GetType().InvokeMember("MyMethod", BindingFlags.Public
                        | BindingFlags.Instance | BindingFlags.InvokeMethod, null, objMsg,
                        new object[] { vxmlRequest.OuterXml });
            }               
            finally
            {
                if (objMsg!=null)
                    ((IDisposable)objMsg).Dispose();
            }

1voto

IanNorton Points 3797

Vous avez besoin d'un bloc finally, lorsque vous souhaitez exécuter du code avant que le bloc ne se termine, peu importe les exceptions (si aucune) qui ont été attrapées. Par exemple, vous pourriez vouloir fermer un fichier ouvert.

Voir aussi try-finally

0voto

Harsh Points 1418

Jetez un œil au lien suivant : https://softwareengineering.stackexchange.com/questions/131397/why-use-try-finally-without-a-catch-clause

Cela dépend de l'architecture de votre application et de l'opération que vous effectuez dans le bloc.

0voto

Neil G Points 7028

Je ne sais rien de C#, mais il semble que tout ce que vous pourriez faire avec un bloc try-finally, vous pourriez le faire de manière plus élégante avec une instruction using. C++ n'a même pas de bloc finally en tant qu'effet de son RAII.

1 votes

Pas nécessairement. Et si vous voulez exécuter un code personnalisé qui n'est pas géré par une simple libération. Par exemple, si vous augmentez un compteur dans le try, puis le diminuez dans un finally, vous ne pouvez pas le faire dans une déclaration using.

0 votes

@MarkA.Donohoe Pouvez-vous ne pas créer un objet qui contient une référence au compteur, qu'il décrémente lorsqu'il est disposé?

0 votes

Oui, mais pourquoi créer un objet entier juste pour implémenter une interface jetable à utiliser avec l'instruction using? C'est adapter le problème à la solution. Un Try-[Catch]-Finally gère tout cela sans avoir à créer un tel objet.

0voto

jitbit Points 8072

Voici un cas d'utilisation que j'utilise toujours (euh..) :

int? x; //notez le type nullable ici!
try
{
    x = int.Parse(someString);
}
catch { } //on s'en fiche, laissons-le juste être nul

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X