Gestire le eccezioni con il debugger in Visual Studio

Un'eccezione è un'indicazione di uno stato di errore che si verifica durante l’esecuzione di un programma. È possibile indicare al debugger le eccezioni o i set di eccezioni da interrompere e a quel punto si vuole che il debugger interrompa ( ovvero sospendere nel debugger). Quando il debugger si interrompe, viene visualizzata la posizione in cui è stata generata l'eccezione. È anche possibile aggiungere o eliminare eccezioni. Con una soluzione aperta in Visual Studio, usare Debug > eccezione Windows > Impostazioni per aprire la finestra Eccezione Impostazioni.

Fornire gestori che rispondono alle eccezioni più importanti. Se è necessario sapere come aggiungere gestori per le eccezioni, vedere Correggere i bug scrivendo codice C# migliore. Informazioni su come configurare il debugger per interrompere sempre l'esecuzione per alcune eccezioni.

Quando si verifica un'eccezione, il debugger scrive un messaggio di eccezione nella finestra Output. Può interrompere l'esecuzione nei casi seguenti quando:

  • Viene generata un'eccezione che non viene gestita.
  • Il debugger è configurato per interrompere l'esecuzione prima che venga richiamato qualsiasi gestore.
  • È stato impostato Just My Code e il debugger è configurato per interrompere qualsiasi eccezione non gestita nel codice utente.

Nota

ASP.NET dispone di un gestore di eccezioni di livello superiore che mostra le pagine di errore in un browser. Non interrompe l'esecuzione a meno che Just My Code non sia attivato. Per un esempio, vedere Indicare al debugger di continuare sulle eccezioni non gestite dall'utente di seguito.

Nota

In un'applicazione Visual Basic il debugger gestisce tutti gli errori come eccezioni, anche se si usano gestori degli errori di tipo On Error.

Indicare al debugger di interrompere quando viene generata un'eccezione

Il debugger può interrompere l'esecuzione nel punto in cui viene generata un'eccezione, pertanto è possibile esaminare l'eccezione prima che venga richiamato un gestore.

Nella finestra Exception Impostazioni (Debug > Windows > Exception Impostazioni) espandere il nodo per una categoria di eccezioni, ad esempio Eccezioni di Common Language Runtime. Selezionare quindi la casella di controllo per un'eccezione specifica all'interno di tale categoria, ad esempio System.AccessViolationException. È inoltre possibile selezionare un'intera categoria di eccezioni.

Screenshot of Exception Settings check box.

Screenshot of Exception Settings check box.

Suggerimento

È possibile trovare eccezioni specifiche usando la finestra Cerca nella barra degli strumenti Eccezione Impostazioni oppure usare la ricerca per filtrare gli spazi dei nomi specifici, ad esempio System.IO.

Se si seleziona un'eccezione nella finestra Eccezione Impostazioni, l'esecuzione del debugger verrà interrotta ovunque venga generata l'eccezione, indipendentemente dal fatto che venga gestita. Ora l'eccezione viene chiamata eccezione per la prima probabilità. Di seguito vengono riportati un paio di scenari di esempio:

  • Nell'applicazione console C# seguente il metodo Main genera un'eccezione AccessViolationException all'interno di un blocco try/catch.

    static void Main(string[] args)
    {
        try
        {
            throw new AccessViolationException();
            Console.WriteLine("here");
        }
        catch (Exception e)
        {
            Console.WriteLine("caught exception");
        }
        Console.WriteLine("goodbye");
    }
    

    Se si dispone di AccessViolationException archiviato in Exception Impostazioni, l'esecuzione verrà interrotta nella throw riga quando si esegue questo codice nel debugger. È quindi possibile continuare l'esecuzione. Nella console dovrebbero essere visualizzate entrambe le righe:

    caught exception
    goodbye
    

    ma non visualizza la here linea.

  • Un'applicazione console C# fa riferimento a una libreria di classi con una classe con due metodi. Un metodo genera un'eccezione e lo gestisce, mentre un secondo metodo genera la stessa eccezione ma non la gestisce.

    public class Class1
    {
        public void ThrowHandledException()
        {
            try
            {
                throw new AccessViolationException();
            }
            catch (AccessViolationException ave)
            {
                Console.WriteLine("caught exception" + ave.Message);
            }
        }
    
        public void ThrowUnhandledException()
        {
            throw new AccessViolationException();
        }
    }
    

    Il metodo seguente è il metodo Main() dell'applicazione console:

    static void Main(string[] args)
    {
        Class1 class1 = new Class1();
        class1.ThrowHandledException();
        class1.ThrowUnhandledException();
    }
    

    Se accessViolationException è archiviato in Exception Impostazioni, l'esecuzione verrà interrotta nella throw riga sia in ThrowHandledException() che in ThrowUnhandledException() quando si esegue questo codice nel debugger.

Per ripristinare le impostazioni predefinite delle eccezioni, scegliere il pulsante Ripristina l'elenco alle impostazioni predefinite:

Screenshot of Restore Defaults in Exception Settings.

Screenshot of Restore Defaults in Exception Settings.

Indicare al debugger di continuare sulle eccezioni non gestite dall'utente

Se si esegue il debug di codice .NET o JavaScript con Just My Code, è possibile indicare al debugger di impedire l'interruzione in caso di eccezioni non gestite nel codice utente ma gestite altrove.

  1. Nella finestra Eccezione Impostazioni aprire il menu di scelta rapida facendo clic con il pulsante destro del mouse su un'etichetta di colonna e quindi scegliere Mostra colonne > Azioni aggiuntive. (Se è stato disattivato Just My Code,you't see this command.) Viene visualizzata una terza colonna denominata Azioni aggiuntive.

    Screenshot of Additional Actions column.

    Screenshot of Additional Actions column.

    Per un'eccezione che mostra Continua quando non gestito nel codice utente in questa colonna, il debugger continua se tale eccezione non viene gestita nel codice utente ma viene gestita esternamente.

  2. Per modificare questa impostazione per una particolare eccezione, selezionare l'eccezione, fare clic con il pulsante destro del mouse per visualizzare il menu di scelta rapida e scegliere Continua quando non gestito in Codice utente. È anche possibile modificare l'impostazione per un'intera categoria di eccezioni, ad esempio l'intera eccezione common Language Runtime.

    Screenshot of Continue when unhandled in user code setting.

    Screenshot of Continue when unhandled in user code setting.

Ad esempio, ASP.NET applicazioni Web gestiscono le eccezioni convertendole in un codice di stato HTTP 500 (gestione delle eccezioni in API Web ASP.NET), che potrebbe non essere utile per determinare l'origine dell'eccezione. Nell'esempio seguente, il codice utente effettua una chiamata a String.Format() che genera un’eccezione FormatException. L'esecuzione si interrompe come segue:

Breaks on user-unhandled exception

Aggiungere ed eliminare le eccezioni

È possibile aggiungere ed eliminare le eccezioni. Per eliminare un tipo di eccezione da una categoria, selezionare l'eccezione e scegliere elimina l'eccezione selezionata dal pulsante elenco (segno meno) sulla barra degli strumenti Eccezione Impostazioni. In alternativa, è possibile fare clic con il pulsante destro del mouse sull'eccezione e scegliere Elimina dal menu di scelta rapida. L'eliminazione di un'eccezione ha lo stesso effetto di avere l'eccezione deselezionata, ovvero che il debugger non verrà interrotto quando viene generata.

Per aggiungere un'eccezione:

  1. Nella finestra Eccezione Impostazioni selezionare una delle categorie di eccezioni, ad esempio Common Language Runtime.

  2. Scegliere il pulsante Aggiungi un'eccezione alla categoria selezionata (segno più).

    Screenshot of Add an exception to the selected category button.

    Screenshot of Add an exception to the selected category button.

  3. Digitare il nome dell'eccezione, ad esempio System.UriTemplateMatchException.

    Screenshot of Type exception name.

    Screenshot of Type exception name.

    L'eccezione viene aggiunta all'elenco (in ordine alfabetico) e selezionata automaticamente.

Per aggiungere un'eccezione alle categorie Eccezioni di accesso alla memoria GPU, Eccezioni di runtime JavaScript o Eccezioni Win32, includere il codice di errore e la descrizione.

Suggerimento

Controllare l’ortografia. La finestra Impostazioni eccezioni non verifica l'esistenza di un'eccezione aggiunta. Pertanto, se si digita Sytem.UriTemplateMatchException, si ottiene una voce per l'eccezione e non per System.UriTemplateMatchException.

Poiché sono persistenti nel file con estensione suo della soluzione, le impostazioni delle eccezioni si applicano a una soluzione specifica. Non è possibile riutilizzare impostazioni di eccezioni specifiche in tutte le soluzioni. Ora vengono mantenute solo le eccezioni aggiunte; le eccezioni eliminate non sono. È possibile aggiungere un'eccezione, chiudere e riaprire la soluzione e l'eccezione sarà ancora presente. Ma se si elimina un'eccezione e si chiude e si riapre la soluzione, l'eccezione viene visualizzata nuovamente.

La finestra Impostazioni eccezioni supporta tipi di eccezioni generiche in C#, ma non in Visual Basic. Per interrompere l’esecuzione in corrispondenza di eccezioni come MyNamespace.GenericException<T>, è necessario aggiungere l'eccezione come MyNamespace.GenericException'1. Ovvero, se è stata creata un'eccezione simile al codice seguente:

public class GenericException<T> : Exception
{
    public GenericException() : base("This is a generic exception.")
    {
    }
}

È possibile aggiungere l'eccezione a Exception Impostazioni usando la procedura precedente:

Screenshot of Add generic exception.

Screenshot of Add generic exception.

Aggiungere condizioni a un'eccezione

Usare la finestra Eccezione Impostazioni per impostare condizioni sulle eccezioni. Le condizioni attualmente supportate includono i nomi del modulo da includere o escludere per l'eccezione. Impostando i nomi dei moduli come condizioni, è possibile scegliere di interrompere l'eccezione solo in determinati moduli di codice. È anche possibile scegliere di evitare interruzioni in determinati moduli.

Nota

L'aggiunta di condizioni a un'eccezione è supportata a partire da Visual Studio 2017.

Per aggiungere eccezioni condizionali:

  1. Scegliere il pulsante Modifica condizioni nella finestra Eccezione Impostazioni oppure fare clic con il pulsante destro del mouse sull'eccezione e scegliere Modifica condizioni.

    Screenshot of exception conditions.

  2. Per aggiungere condizioni aggiuntive necessarie all'eccezione, selezionare Aggiungi condizione per ogni nuova condizione. Vengono visualizzate righe di condizione aggiuntive.

    Screenshot of extra conditions for an exception.

  3. Per ogni riga di condizione, digitare il nome del modulo e modificare l'elenco di operatori di confronto in Equals o Not Equals. È possibile specificare caratteri jolly (\*) nel nome per specificare più moduli.

  4. Se è necessario eliminare una condizione, scegliere la X alla fine della riga della condizione.