4
votes

Comment utiliser la construction try-finally en C #?

Nous avons vu de nombreuses questions sur les constructions try-catch-finally et try-finally sur ce forum.

Le nombre de réponses augmente le nombre de questions , donc j'en ai peu aussi.

Voici un lien vers la construction d'essai d'explication de Microsoft. Je l'ai déjà lu!

Dans l'article suivant écrit:

Dans une exception gérée, le bloc finally associé est garanti être exécuté. Cependant, si l'exception n'est pas gérée, l'exécution du Enfin, le bloc dépend de la façon dont l'opération de déroulement de l'exception est déclenché. Cela dépend à son tour de la façon dont votre ordinateur est configuré.

  1. Ai-je bien compris que dans la construction try-catch-finally , finally sera toujours exécutée? (Hors Environment.FastFail () )

    J'ai lu des informations sur StackOverFlowException (ce bloc enfin n'est pas exécuté à cette occasion) sur ce forum, mais lorsque je lance il, le bloc enfin est exécuté. Alors, qu'en est-il de StackOverFlowException ?

  2. Pourquoi le bloc enfin n'est pas appelé? (Dans le code ci-dessous)?

  3. Pour quels cas nous utilisons généralement try-finally?

  4. De quel paramètre de PC dépend le bloc enfin ?


using System;
namespace ConsoleApplication1
{
class Program
    {
    static void Main(string[] args)
        {
            try
            {
                throw  new Exception(); 
            }                              
            finally
            {
                Console.WriteLine("finally");
                Console.ReadKey();
            }
        }
    }
}    


4 commentaires

Cela fait 4,5 questions; celui-ci sera probablement fermé car trop large.


normalement, votre finally est toujours exécuté afin que vous puissiez supprimer vos objets et fermer toutes les fuites de mémoire si elles sont créées. Sur la question de savoir comment votre ordinateur est configuré, je ne sais pas ...


"ce forum" ne veut pas être un forum.


Ce bloc final devrait s'exécuter. Vous savez comment continuer dans le débogueur, non?


3 Réponses :


6
votes
  1. Oui, dans la plupart des cas, un bloc finally sera toujours exécuté si vous n'interrompez pas l'exécution avec quelque chose comme Environment.Exit (0) ou Application.Exit () (comme Common Man mentionné dans sa réponse).

    Pour une StackOverFlowException et d'autres plantages d'application profonds, elle ne peut pas s'exécuter car lorsque la pile est pleine, il n'y a plus de mémoire dans ce thread pour exécuter une opération normale. Ainsi, lorsque vous lancez l'exception vous-même, il n'y a pas de véritable pile complète et l'application peut continuer à fonctionner.

  2. Le bloc finally n'est pas appelé dans le débogueur car le débogueur se ferme immédiatement s'il y a une exception non gérée au niveau supérieur car il n'y a pas de gestionnaire d'exceptions de niveau supérieur. Consultez cette réponse pour une explication plus approfondie. Si vous exécutez l'application sans le débogueur attaché, le bloc finally sera appelé - grâce à bommelding pour avoir compris cela.

  3. Vous utilisez les blocs finally chaque fois que vous devez vous assurer de nettoyer correctement. Consultez cette réponse pour une explication plus approfondie.

  4. C'est une question difficile, je pense que cela est destiné à décrire les effets des paramètres du PC tels que les antivirus mettant fin à des programmes lorsqu'ils essaient de créer un débordement de tampon ou une situation similaire potentiellement critique. De la même manière, l'exécution des blocs finally pourrait être empêchée par prévention de l'exécution des données ou d'autres fonctionnalités de sécurité.


4 commentaires

re 2: il devrait définitivement fonctionner.


@bommelding J'ai pensé cela au début aussi - mais non, cela ne fonctionne pas - voyez la réponse liée et essayez-la vous-même. Cela ne fonctionne pas.


OK, il ne fonctionne pas dans le débogueur, mon mauvais. Appuyez sur Ctrl + F5 puis "Fermer le programme". Vous verrez "enfin".


Vous avez raison, c'est intéressant. Je modifierai ma réponse en conséquence.



0
votes

1.Suis-je bien compris que dans la construction try-catch-finally, finalement, sera toujours exécuté? (Hors Environment.FastFail () )

Le bloc finally ne sera pas appelé après le retour dans quelques scénarios uniques: si System.exit () est appelé en premier, ou si la VM plante.

2.Pourquoi le bloc enfin n'est pas appelé? (dans le code ci-dessous)?

Lisez ici: Un bloc finally peut-il être interrompu / suspendu?

  1. Dans quels cas nous utilisons généralement try-finally?

try {} finally {} doit être utilisé dans les cas où vous ne pouvez pas gérer l'exception, mais où vous devez nettoyer les ressources.

Ou il est toujours préférable d'afficher quelque chose et de quitter gracieusement après qu'une exception exceptionnelle se soit produite dans notre programme.


0 commentaires

0
votes

1 - Cela dépend. L'idée d'utiliser un bloc finally est de nettoyer les ressources allouées dans le bloc try. Même si une exception se produit dans le bloc try, vous pouvez exécuter du code dans le bloc finally. Cependant, le bloc finally est garanti de s'exécuter dans une exception gérée. Si l'exception n'est pas gérée, l'exécution de finally dépend de la façon dont l'opération de déroulement de l'exception est déclenchée.

2 - Votre finalement ne sont pas appelés car l'exception n'est pas gérée. La documentation Microsoft indique «Habituellement, lorsqu'une exception non gérée met fin à une application, que le bloc finally soit exécuté ou non n'est pas important. Cependant, si vous avez des instructions dans un bloc finally qui doivent être exécutées même dans cette situation, une solution consiste à ajouter un bloc catch à l'instruction try-finally. " Comparez les exemples sur https: // docs. microsoft.com/en-us/dotnet/csharp/language-reference/keywords/try-finally pour voir la différence entre l'exception gérée et l'exception non gérée.

En savoir plus sur cette question Pourquoi utiliser enfin en C #?

Sources https://docs.microsoft.com/ fr-fr / dotnet / csharp / language-reference / keywords / try-finally https://docs.microsoft. com / fr-fr / dotnet / csharp / language-reference / keywords / try-catch-finally


0 commentaires