Exceptions dans les threads managésExceptions in Managed Threads

À partir du .NET Framework version 2.0, le common language runtime permet à la plupart des exceptions non prises en charge dans les threads de poursuivre naturellement.Starting with the .NET Framework version 2.0, the common language runtime allows most unhandled exceptions in threads to proceed naturally. Dans la plupart des cas, cela signifie que l’exception non prise en charge provoque l’arrêt de l’application.In most cases this means that the unhandled exception causes the application to terminate.

Notes

Il s’agit d’un changement important par rapport au .NET Framework versions 1.0 et 1.1, qui assurent une protection pour nombreuses exceptions non prises en charge, par exemple les exceptions non prises en charge dans les threads des pools de threads.This is a significant change from the .NET Framework versions 1.0 and 1.1, which provide a backstop for many unhandled exceptions — for example, unhandled exceptions in thread pool threads. Consultez la section Changements par rapport aux versions précédentes plus loin dans cette rubrique.See Change from Previous Versions later in this topic.

Le common language runtime représente une protection pour certaines exceptions non prises en charge qui sont utilisées pour contrôler le flux du programme :The common language runtime provides a backstop for certain unhandled exceptions that are used for controlling program flow:

  • Une ThreadAbortException est levée dans un thread, car Abort a été appelé.A ThreadAbortException is thrown in a thread because Abort was called.

  • Une AppDomainUnloadedException est levée dans un thread, car le domaine d’application dans lequel le thread s’exécute est en cours de déchargement.An AppDomainUnloadedException is thrown in a thread because the application domain in which the thread is executing is being unloaded.

  • Le common language runtime ou un processus hôte met fin au thread en levant une exception interne.The common language runtime or a host process terminates the thread by throwing an internal exception.

Si l’une de ces exceptions n’est pas prise en charge dans les threads créés par le common language runtime, elle arrête le thread, mais le common language runtime n’autorise pas l’exception à poursuivre.If any of these exceptions are unhandled in threads created by the common language runtime, the exception terminates the thread, but the common language runtime does not allow the exception to proceed further.

Si ces exceptions ne sont pas prises en charge dans le thread principal ou dans les threads qui sont entrés dans le runtime à partir de code non managé, elles se poursuivent normalement, ce qui entraîne l’arrêt de l’application.If these exceptions are unhandled in the main thread, or in threads that entered the runtime from unmanaged code, they proceed normally, resulting in termination of the application.

Notes

Il est possible que le runtime lève une exception non prise en charge avant que du code managé ait pu installer un gestionnaire d’exceptions.It is possible for the runtime to throw an unhandled exception before any managed code has had a chance to install an exception handler. Bien que le code managé n’ait pas eu la possibilité de traiter cette exception, elle est autorisée à poursuivre naturellement.Even though managed code had no chance to handle such an exception, the exception is allowed to proceed naturally.

Mettre en lumière des problèmes de threads au cours du développementExposing Threading Problems During Development

Lorsque les threads sont autorisés à s’interrompre de façon silencieuse, sans arrêter l’application, de graves problèmes de programmation risquent de passer inaperçus.When threads are allowed to fail silently, without terminating the application, serious programming problems can go undetected. Il s’agit d’un problème particulier pour les services et autres applications qui s’exécutent sur de longues périodes.This is a particular problem for services and other applications which run for extended periods. Au fur et à mesure des échecs de threads, le programme s’endommage progressivement.As threads fail, program state gradually becomes corrupted. L’application risque de voir ses performances se dégrader ou de ne plus répondre.Application performance may degrade, or the application might become unresponsive.

Le fait d’autoriser les exceptions non prises en charge dans les threads à poursuivre naturellement, jusqu’à ce que le système d’exploitation arrête le programme, expose à de tels problèmes lors du développement et des tests.Allowing unhandled exceptions in threads to proceed naturally, until the operating system terminates the program, exposes such problems during development and testing. Les rapports d’erreurs sur les arrêts du programme prennent en charge le débogage.Error reports on program terminations support debugging.

Changements par rapport aux versions antérieuresChange from Previous Versions

La modification la plus importante concerne les threads managés.The most significant change pertains to managed threads. Dans les versions 1.0 et 1.1 du .NET Framework, le common language runtime représente une protection pour les exceptions non prises en charge dans les situations suivantes :In the .NET Framework versions 1.0 and 1.1, the common language runtime provides a backstop for unhandled exceptions in the following situations:

  • Il n’existe pas d’exceptions non prises en charge sur un thread de pool de threads.There is no such thing as an unhandled exception on a thread pool thread. Lorsqu’une tâche lève une exception qu’elle ne prend pas en charge, le runtime imprime l’arborescence des appels de procédure de l’exception dans la console, puis renvoie le thread au pool de threads.When a task throws an exception that it does not handle, the runtime prints the exception stack trace to the console and then returns the thread to the thread pool.

  • Il n’existe pas d’exceptions non prises en charge sur un thread créé avec la méthode Start de la classe Thread.There is no such thing as an unhandled exception on a thread created with the Start method of the Thread class. Lorsque le code qui s’exécute sur un tel thread lève une exception qu’elle ne prend pas en charge, le runtime imprime l’arborescence des appels de procédure de l’exception dans la console, puis arrête correctement le thread.When code running on such a thread throws an exception that it does not handle, the runtime prints the exception stack trace to the console and then gracefully terminates the thread.

  • Il n’existe pas d’exceptions non prises en charge sur le thread du finaliseur.There is no such thing as an unhandled exception on the finalizer thread. Lorsqu’un finaliseur lève une exception qu’elle ne prend pas en charge, le runtime imprime l’arborescence des appels de procédure de l’exception dans la console, puis permet au thread du finaliseur de reprendre l’exécution des finaliseurs.When a finalizer throws an exception that it does not handle, the runtime prints the exception stack trace to the console and then allows the finalizer thread to resume running finalizers.

L’état au premier plan ou en arrière-plan d’un thread managé n’affecte pas ce comportement.The foreground or background status of a managed thread does not affect this behavior.

Dans le cas des exceptions non prises en charge sur les threads provenant de code non managé, la différence est plus subtile.For unhandled exceptions on threads originating in unmanaged code, the difference is more subtle. La boîte de dialogue à liaison JIT du runtime prévaut sur la boîte de dialogue du système d’exploitation pour les exceptions managées ou les exceptions natives sur les threads qui sont passés à travers du code natif.The runtime JIT-attach dialog preempts the operating system dialog for managed exceptions or native exceptions on threads that have passed through native code. Le processus s’arrête dans tous les cas.The process terminates in all cases.

Migrer du codeMigrating Code

En général, la modification permet de mettre en lumière des problèmes de programmation auparavant non reconnus afin de les résoudre.In general, the change will expose previously unrecognized programming problems so that they can be fixed. Dans certains cas, toutefois, les programmeurs pouvaient tirer parti de la protection du runtime, par exemple pour arrêter des threads.In some cases, however, programmers might have taken advantage of the runtime backstop, for example to terminate threads. Selon la situation, ils doivent envisager l’une des stratégies de migration suivantes :Depending on the situation, they should consider one of the following migration strategies:

  • Restructurer le code de façon que le thread s’arrête normalement à la réception d’un signal.Restructure the code so the thread exits gracefully when a signal is received.

  • Utilisez la méthode Thread.Abort pour abandonner le thread.Use the Thread.Abort method to abort the thread.

  • Si un thread doit être arrêté pour permettre l’arrêt du processus, faire du thread un thread d’arrière-plan afin qu’il s’arrête automatiquement à la sortie du processus.If a thread must be stopped so that process termination can proceed, make the thread a background thread so that it is automatically terminated on process exit.

Dans tous les cas, la stratégie doit respecter les instructions de conception des exceptions.In all cases, the strategy should follow the design guidelines for exceptions. Consultez la page Instructions de conception des exceptions.See Design Guidelines for Exceptions.

Indicateur de compatibilité des applicationsApplication Compatibility Flag

À titre de mesure de compatibilité temporaire, les administrateurs peuvent placer un indicateur de compatibilité dans la section <runtime> du fichier de configuration de l’application.As a temporary compatibility measure, administrators can place a compatibility flag in the <runtime> section of the application configuration file. Cela entraîne le retour du common language runtime au comportement des versions 1.0 et 1.1.This causes the common language runtime to revert to the behavior of versions 1.0 and 1.1.

<legacyUnhandledExceptionPolicy enabled="1"/>  

Remplacement de l’hôteHost Override

Dans le .NET Framework version 2.0, un hôte non managé peut utiliser l’interface ICLRPolicyManager dans l’API d’hébergement pour remplacer la stratégie d’exceptions non prises en charge par défaut du common language runtime.In the .NET Framework version 2.0, an unmanaged host can use the ICLRPolicyManager interface in the Hosting API to override the default unhandled exception policy of the common language runtime. La fonction ICLRPolicyManager::SetUnhandledExceptionPolicy est utilisée pour définir la stratégie des exceptions non prises en charge .The ICLRPolicyManager::SetUnhandledExceptionPolicy function is used to set the policy for unhandled exceptions.

Voir aussiSee also