Eccezioni in thread gestitiExceptions in Managed Threads

A partire da .NET Framework versione 2.0, Common Language Runtime consente alla maggior parte delle eccezioni non gestite nei thread di proseguire normalmente.Starting with the .NET Framework version 2.0, the common language runtime allows most unhandled exceptions in threads to proceed naturally. Nella maggior parte dei casi questo significa che l'eccezione non gestita provoca l'interruzione dell'applicazione.In most cases this means that the unhandled exception causes the application to terminate.

Nota

Si tratta di una cambiamento significativo rispetto alle versioni 1.0 e 1.1 di .NET Framework, che forniscono una barriera per numerose eccezioni non gestite, ad esempio, eccezioni non gestite nel pool di thread.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. Vedere Cambiamenti rispetto alle versioni precedenti più avanti in questo argomento.See Change from Previous Versions later in this topic.

Common Language Runtime fornisce una barriera per determinate eccezioni non gestite usate per controllare il flusso del programma:The common language runtime provides a backstop for certain unhandled exceptions that are used for controlling program flow:

  • Viene generata un'eccezione ThreadAbortException in un thread perché è stato chiamato il metodo Abort.A ThreadAbortException is thrown in a thread because Abort was called.

  • Viene generata un'eccezione AppDomainUnloadedException in un thread perché è in corso lo scaricamento del dominio dell'applicazione in cui è in esecuzione il thread.An AppDomainUnloadedException is thrown in a thread because the application domain in which the thread is executing is being unloaded.

  • Common Language Runtime o un processo host termina il thread generando un'eccezione interna.The common language runtime or a host process terminates the thread by throwing an internal exception.

Se una qualsiasi di queste eccezioni viene gestita nei thread creati da Common Language Runtime, l'eccezione termina il thread, ma Common Language Runtime non consente all'eccezione di proseguire.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.

Se queste eccezioni vengono gestite nel thread principale o in thread immessi nel runtime dal codice non gestito, esse proseguono normalmente con una conseguente chiusura dell'applicazione.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.

Nota

È possibile che il runtime generi un'eccezione non gestita prima che qualsiasi codice gestito abbia avuto la possibilità di installare un gestore di eccezioni.It is possible for the runtime to throw an unhandled exception before any managed code has had a chance to install an exception handler. Anche se il codice gestito non può gestire tale eccezione, all'eccezione è consentito proseguire normalmente.Even though managed code had no chance to handle such an exception, the exception is allowed to proceed naturally.

Esposizione di problemi di threading durante lo sviluppoExposing Threading Problems During Development

Quando nei thread si verifica un errore in modo silenzioso ma l'applicazione non viene terminata, è possibile che vengano rilevati gravi problemi di programmazione.When threads are allowed to fail silently, without terminating the application, serious programming problems can go undetected. Si tratta di un problema specifico dei servizi e delle altre applicazioni eseguite per periodi prolungati.This is a particular problem for services and other applications which run for extended periods. In caso di errore dei thread, il programma viene gradualmente danneggiato.As threads fail, program state gradually becomes corrupted. L'errore può influire negativamente sulle prestazioni dell'applicazione o l'applicazione potrebbe bloccarsi.Application performance may degrade, or the application might become unresponsive.

Consentire alle eccezioni non gestite nei thread di proseguire normalmente finché il sistema operativo non termina il programma permette di esporre tali problemi durante le fasi di sviluppo e test.Allowing unhandled exceptions in threads to proceed naturally, until the operating system terminates the program, exposes such problems during development and testing. I report di errore relativi alle chiusure dei programmi supportano il debug.Error reports on program terminations support debugging.

Cambiamenti dalle versioni precedentiChange from Previous Versions

Il cambiamento più significativo riguarda i thread gestiti.The most significant change pertains to managed threads. In .NET Framework versioni 1.0 e 1.1, Common Language Runtime fornisce una barriera per le eccezioni non gestite nelle situazioni seguenti:In the .NET Framework versions 1.0 and 1.1, the common language runtime provides a backstop for unhandled exceptions in the following situations:

  • Non esiste alcun equivalente di un'eccezione non gestita in un pool di thread.There is no such thing as an unhandled exception on a thread pool thread. Quando un'attività genera un'eccezione non gestibile, il runtime consente di stampare la traccia dello stack eccezione nella console e quindi restituisce il thread al pool di thread.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.

  • Non esiste alcun equivalente di un'eccezione non gestita in un thread creato con il metodo Start della classe Thread.There is no such thing as an unhandled exception on a thread created with the Start method of the Thread class. Quando un codice in esecuzione su un thread simile genera un'eccezione non gestibile, il runtime consente di stampare la traccia dello stack eccezione nella console e quindi termina normalmente il 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.

  • Non esiste alcun equivalente di un'eccezione non gestita nel thread finalizzatore.There is no such thing as an unhandled exception on the finalizer thread. Se un finalizzatore genera un'eccezione non gestibile, il runtime consente di stampare la traccia dello stack eccezione nella console e consente quindi al thread finalizzatore di riprendere l'esecuzione dei finalizzatori.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.

Lo stato in primo piano o in background di un thread gestito non influisce su tale comportamento.The foreground or background status of a managed thread does not affect this behavior.

Per le eccezioni non gestite nei thread di origine nel codice non gestito, la differenza è più complessa.For unhandled exceptions on threads originating in unmanaged code, the difference is more subtle. La finestra di dialogo dell'associazione JIT del runtime ha la precedenza sulla finestra di dialogo del sistema operativo per le eccezioni gestite o native nei thread passati attraverso il codice nativo.The runtime JIT-attach dialog preempts the operating system dialog for managed exceptions or native exceptions on threads that have passed through native code. Il processo viene terminato in tutti i casi.The process terminates in all cases.

Migrazione del codiceMigrating Code

In generale, il cambiamento metterà in evidenza i problemi di programmazione in precedenza non riconosciuti in modo che possano essere risolti.In general, the change will expose previously unrecognized programming problems so that they can be fixed. In alcuni casi, tuttavia, i programmatori potrebbero aver sfruttato la barriera di runtime, ad esempio per interrompere i thread.In some cases, however, programmers might have taken advantage of the runtime backstop, for example to terminate threads. A seconda della situazione, è necessario considerare una delle seguenti strategie di migrazione:Depending on the situation, they should consider one of the following migration strategies:

  • Ristrutturare il codice in modo che il thread venga chiuso normalmente quando viene ricevuto un segnale.Restructure the code so the thread exits gracefully when a signal is received.

  • Usare il metodo Thread.Abort per interrompere il thread.Use the Thread.Abort method to abort the thread.

  • Se un thread deve essere arrestato in modo che la terminazione del processo possa continuare, spostare il thread in background in modo che venga terminato automaticamente all'uscita dal processo.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.

In tutti i casi, la strategia deve rispettare le linee guida di progettazione per le eccezioni.In all cases, the strategy should follow the design guidelines for exceptions. Vedere Linee guida di progettazione delle eccezioni.See Design Guidelines for Exceptions.

Contrassegno della compatibilità delle applicazioniApplication Compatibility Flag

Come misura di compatibilità temporanea, gli amministratori possono inserire un contrassegno di compatibilità nella sezione <runtime> del file di configurazione dell'applicazione.As a temporary compatibility measure, administrators can place a compatibility flag in the <runtime> section of the application configuration file. In questo modo Common Language Runtime può ripristinare il comportamento delle versioni 1.0 e 1.1.This causes the common language runtime to revert to the behavior of versions 1.0 and 1.1.

<legacyUnhandledExceptionPolicy enabled="1"/>  

Override dell'hostHost Override

In .NET Framework versione 2.0 un host non gestito può sfruttare l'interfaccia ICLRPolicyManager nell'API di hosting per eseguire l'override del criterio predefinito dell'eccezione non gestita di 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 funzione ICLRPolicyManager:: SetUnhandledExceptionPolicy viene usata per impostare il criterio per le eccezioni non gestite.The ICLRPolicyManager::SetUnhandledExceptionPolicy function is used to set the policy for unhandled exceptions.

Vedere ancheSee also