Ausnahmen in verwalteten ThreadsExceptions in Managed Threads

Ab .NET Framework, Version 2.0, erlaubt die Common Language Runtime bei den meisten Ausnahmefehlern in Threads deren ordnungsgemäße Fortsetzung.Starting with the .NET Framework version 2.0, the common language runtime allows most unhandled exceptions in threads to proceed naturally. Das für i. d R. dazu, dass die Anwendung durch die unbehandelte Ausnahme beendet wird.In most cases this means that the unhandled exception causes the application to terminate.

Hinweis

Dies ist eine wichtige Änderung im Vergleich zu den .NET Framework-Versionen 1.0 und 1.1, die für zahlreiche unbehandelte Ausnahmen ein Sicherheitsnetz bereitstellen, z. B. für unbehandelte Ausnahmen in Threadpoolthreads.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. Weitere Informationen finden Sie später in diesem Thema unter Änderung von früheren Versionen.See Change from Previous Versions later in this topic.

Die Common Language Runtime stellt für bestimmte unbehandelte Ausnahmen, die zum Steuern des Programmablaufs verwendet werden, ein Sicherheitsnetz bereit:The common language runtime provides a backstop for certain unhandled exceptions that are used for controlling program flow:

  • In einem Thread wird eine ThreadAbortException ausgelöst, da Abort aufgerufen wurde.A ThreadAbortException is thrown in a thread because Abort was called.

  • In einem Thread wird eine AppDomainUnloadedException ausgelöst, da die Anwendungsdomäne, in der der Thread ausgeführt wird, entladen wird.An AppDomainUnloadedException is thrown in a thread because the application domain in which the thread is executing is being unloaded.

  • Die Common Language Runtime oder ein Hostprozess beendet den Thread durch Auslösen einer internen Ausnahme.The common language runtime or a host process terminates the thread by throwing an internal exception.

Wenn eine dieser Ausnahmen in Threads, die von der Common Language Runtime erstellt wurden, nicht behandelt werden, beendet die Ausnahme den Thread, die Common Language Runtime lässt jedoch die Weiterreichung der Ausnahme nicht zu.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.

Wenn diese Ausnahmen im Hauptthread oder in Threads, die von nicht verwaltetem Code in die Laufzeit eintreten, nicht behandelt werden, werden sie normal fortgesetzt, d. h., sie beenden die Anwendung.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.

Hinweis

Die Laufzeit kann eine unbehandelte Ausnahme auslösen, bevor verwalteter Code einen Ausnahmehandler installieren kann.It is possible for the runtime to throw an unhandled exception before any managed code has had a chance to install an exception handler. Auch wenn verwalteter Code eine derartige Ausnahme nicht behandeln könnte, kann die Ausnahme normal fortgesetzt werden.Even though managed code had no chance to handle such an exception, the exception is allowed to proceed naturally.

Aufdecken von Threadingproblemen bei der EntwicklungExposing Threading Problems During Development

Wenn Threads unerkannt fehlschlagen können, ohne die Anwendung zu beenden, können Sie gravierende Programmierfehler übersehen.When threads are allowed to fail silently, without terminating the application, serious programming problems can go undetected. Dies ist insbesondere bei Diensten und anderen Anwendungen ein Problem, die über einen längeren Zeitraum ausgeführt werden.This is a particular problem for services and other applications which run for extended periods. Durch das Fehlschlagen von Threads wird der Programmzustand allmählich beschädigt.As threads fail, program state gradually becomes corrupted. Dadurch kann sich die Anwendungsleistung verschlechtern, und es kann passieren, dass die Anwendung nicht mehr reagiert.Application performance may degrade, or the application might become unresponsive.

Wenn Sie die normale Fortsetzung von unbehandelten Ausnahmen in Threads zulassen, bis das Programm vom Betriebssystem beendet wird, werden derartige Probleme bei der Entwicklung und beim Testen entdeckt.Allowing unhandled exceptions in threads to proceed naturally, until the operating system terminates the program, exposes such problems during development and testing. Fehlerberichte über Beendigungen des Programms unterstützen das Debuggen.Error reports on program terminations support debugging.

Änderung von früheren VersionenChange from Previous Versions

Die wichtigste Änderung betrifft verwaltete Threads.The most significant change pertains to managed threads. In den .NET Framework-Versionen 1.0 und 1.1 stellt die Common Language Runtime für unbehandelte Ausnahmen in den folgenden Situationen ein Sicherheitsnetz bereit:In the .NET Framework versions 1.0 and 1.1, the common language runtime provides a backstop for unhandled exceptions in the following situations:

  • In einem Threadpoolthread gibt es keine unbehandelten Ausnahmen.There is no such thing as an unhandled exception on a thread pool thread. Wenn eine Aufgabe eine Ausnahme auslöst, die sie nicht behandelt, gibt die Laufzeit die Ausnahmestapelüberwachung an die Konsole aus, und gibt den Thread an den Threadpool zurück.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.

  • In einem Thread, der mit der Start-Methode der Thread-Klasse behandelt wird, gibt es keine unbehandelten Ausnahmen.There is no such thing as an unhandled exception on a thread created with the Start method of the Thread class. Wenn Code, der in einem derartigen Thread ausgeführt wird, eine Ausnahme auslöst, die er nicht behandelt, gibt die Laufzeit die Ausnahmestapelüberwachung an die Konsole aus und beendet den Thread dann ordnungsgemäß.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.

  • In einem Finalizerthread gibt keine unbehandelten Ausnahmen.There is no such thing as an unhandled exception on the finalizer thread. Wenn ein Finalizer eine Ausnahme auslöst, die er nicht behandelt, gibt die Laufzeit die Ausnahmestapelüberwachung an die Konsole aus und lässt den Finalizerthread dann die Ausführung von Finalizern fortsetzen.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.

Der Vordergrund- oder Hintergrundstatus eines verwalteten Threads beeinflusst dieses Verhalten nicht.The foreground or background status of a managed thread does not affect this behavior.

Bei unbehandelten Ausnahmen in Threads, die aus nicht verwaltetem Code stammen, ist der Unterschied feiner.For unhandled exceptions on threads originating in unmanaged code, the difference is more subtle. Das Dialogfeld des an einen Prozess angefügten JIT hat bei verwalteten Ausnahmen oder systemeigenen Ausnahmen in Threads, die durch systemeigenen Code übergeben wurden, Vorrang vor dem Dialogfeld des Betriebssystems.The runtime JIT-attach dialog preempts the operating system dialog for managed exceptions or native exceptions on threads that have passed through native code. Der Prozess wird in allen Fällen beendet.The process terminates in all cases.

Migrieren von CodeMigrating Code

Die Änderung deckt im Allgemeinen zuvor unerkannte Programmierfehler auf, sodass diese behoben werden können.In general, the change will expose previously unrecognized programming problems so that they can be fixed. In einigen Fällen war das Sicherheitsnetz der Laufzeit jedoch für Programmierer praktisch, z. B. zum Beenden von Threads.In some cases, however, programmers might have taken advantage of the runtime backstop, for example to terminate threads. Je nach Situation bietet sich eine der folgenden Migrationsstrategien an:Depending on the situation, they should consider one of the following migration strategies:

  • Strukturieren Sie den Code so um, dass der Thread beim Empfang eines Signals ordnungsgemäß beendet wird.Restructure the code so the thread exits gracefully when a signal is received.

  • Verwenden Sie die Thread.Abort-Methode, um den Thread abzubrechen.Use the Thread.Abort method to abort the thread.

  • Wenn ein Thread angehalten werden muss, um die Prozessbeendigung fortzusetzen, machen Sie den Thread zu einem Hintergrundthread, damit er beim Prozessende automatisch beendet wird.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.

Sie sollten dabei auf jeden die Entwurfsrichtlinien für Ausnahmen einhalten.In all cases, the strategy should follow the design guidelines for exceptions. Siehe Entwurfsrichtlinien für Ausnahmen.See Design Guidelines for Exceptions.

AnwendungskompatibilitätsflagApplication Compatibility Flag

Administratoren können als vorübergehende Kompatibilitätsmaßnahme im <runtime>-Abschnitt der Anwendungskonfigurationsdatei ein Kompatibilitätsflag angeben.As a temporary compatibility measure, administrators can place a compatibility flag in the <runtime> section of the application configuration file. Dadurch wird die Common Language Runtime auf das Verhalten der Versionen 1.0 und 1.1 zurückgesetzt.This causes the common language runtime to revert to the behavior of versions 1.0 and 1.1.

<legacyUnhandledExceptionPolicy enabled="1"/>  

HostüberschreibungHost Override

In .NET Framework, Version 2.0, kann ein nicht verwalteter Host über die ICLRPolicyManager-Schnittstelle in der Hosting-API die Standardrichtlinie für unbehandelte Ausnahmen der Common Language Runtime überschreiben.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. Die ICLRPolicyManager::SetUnhandledExceptionPolicy-Funktion wird zum Festlegen der Richtlinie für unbehandelte Ausnahmen verwendet.The ICLRPolicyManager::SetUnhandledExceptionPolicy function is used to set the policy for unhandled exceptions.

Siehe auchSee also