189 votes

Quand est finalement exécuté si vous lancez une exception du bloc catch?

 try {
   // Do stuff
}
catch (Exception e) {
   throw;
}
finally {
   // Clean up
}
 

Dans le bloc ci-dessus, quand est appelé le dernier bloc? Avant le lancement de e ou est finalement appelé et puis attraper?

193voto

Eric Petroelje Points 40734

il serait appelé après que e soit relancé (c'est-à-dire après l'exécution du bloc catch)

120voto

Marc Gravell Points 482669

Pourquoi ne pas l'essayer:

 outer try
inner try
inner catch
inner finally
outer catch
outer finally
 

avec code (formaté pour l'espace vertical):

 static void Main() {
    try {
        Console.WriteLine("outer try");
        DoIt();
    } catch {
        Console.WriteLine("outer catch");
        // swallow
    } finally {
        Console.WriteLine("outer finally");
    }
}
static void DoIt() {
    try {
        Console.WriteLine("inner try");
        int i = 0;
        Console.WriteLine(12 / i); // oops
    } catch (Exception e) {
        Console.WriteLine("inner catch");
        throw e; // or "throw", or "throw anything"
    } finally {
        Console.WriteLine("inner finally");
    }
}
 

24voto

Daniel Pryden Points 22167

Votre exemple se comporterait de la même manière que ce code:

 try {
    try {
        // Do stuff
    } catch(Exception e) {
        throw e;
    }
} finally {
    // Clean up
}
 

En remarque, si vous voulez vraiment dire throw e; (c’est-à-dire lancer la même exception que vous venez de prendre), il est bien mieux de ne faire que throw; , car cela préservera l’original trace de pile au lieu d'en créer une nouvelle.

2voto

JonH Points 20454

Un moyen simple de le savoir consiste également à déboguer votre code et à vous avertir de l'appel final.

1voto

Van Thi Points 11

Lors du test avec une application console C #, le code finally a été exécuté après la levée de l'exception: le "dialogue d'erreur d'application" existait et, une fois l'option "Fermer le programme" sélectionnée, le bloc finally a été exécuté dans cette fenêtre de la console. Mais en définissant le point de rupture à l'intérieur du bloc de code finally, je ne peux jamais l'atteindre. Le débogueur continue de s’arrêter à l’instruction throw. Voici mon code de test:

     class Program
    {
       static void Main(string[] args)
       {
          string msg;
          Console.WriteLine(string.Format("GetRandomNuber returned: {0}{1}", GetRandomNumber(out msg), msg) == "" ? "" : "An error has occurred: " + msg);
       }

       static int GetRandomNumber(out string errorMessage)
       {
         int result = 0;
         try
         {
            errorMessage = "";
            int test = 0;
            result = 3/test;
            return result;
         }
         catch (Exception ex)
         {
            errorMessage = ex.Message;
            throw ex;

         }
         finally
         {
            Console.WriteLine("finally block!");
         }

       }
    }
 

Débogage dans VS2010 - .NET Framework 4.0

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