Condividi tramite


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 quali eccezioni o set di eccezioni su cui sospendere l'esecuzione e a quale punto si desidera che il debugger si interrompa (cioè, fermarsi 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, utilizzare Debug > Windows > Impostazioni eccezioni per aprire la finestra Impostazioni eccezioni.

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.

Annotazioni

ASP.NET dispone di un gestore di eccezioni di primo livello 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.

Annotazioni

In un'applicazione Visual Basic, il debugger gestisce tutti gli errori come eccezioni, anche se si utilizzano gestori di errori nello stile di 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 Impostazioni eccezioni (Windows Debug, > Impostazioni eccezioni>), espandete 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. È anche possibile selezionare un'intera categoria di eccezioni.

Screenshot della casella di controllo delle Impostazioni eccezioni.

Suggerimento

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

Se si seleziona un'eccezione nella finestra Impostazioni eccezioni , 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 sono riportati alcuni scenari:

  • Nell'applicazione console C# seguente, il metodo Main genera un 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 accessViolationException è selezionato in Impostazioni eccezioni, l'esecuzione si interromperà nella throw riga quando si esegue questo codice nel debugger. È quindi possibile continuare l'esecuzione. La console deve visualizzare 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();
        }
    }
    

    Ecco il metodo Main() dell'applicazione console:

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

    Se AccessViolationException è selezionato in Impostazioni eccezioni, 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 di

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 Impostazioni eccezioni 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, questo comando non verrà visualizzato. Viene visualizzata una terza colonna denominata Azioni aggiuntive .

    Screenshot della colonna Azioni aggiuntive.

    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 di Continua quando non gestito nell'impostazione del codice utente.

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

Interruzione su eccezione non gestita dall'utente

Aggiungere ed eliminare eccezioni

È possibile aggiungere ed eliminare 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 Impostazioni eccezioni . 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 che si ha quando non è selezionata nel debugger: il debugger non si fermerà quando l'eccezione viene generata.

Per aggiungere un'eccezione:

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

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

    Screenshot dell'opzione Aggiungi un'eccezione al pulsante categoria selezionato.

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

    Screenshot del nome dell'eccezione di tipo.

    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

Controlla l'ortografia! La finestra Impostazioni eccezioni non verifica l'esistenza di un'eccezione aggiunta. Quindi se si digita Sytem.UriTemplateMatchException, si otterrà una voce per tale eccezione (e non per System.UriTemplateMatchException).

Le impostazioni delle eccezioni sono mantenute nel file .suo della soluzione, quindi si applicano a una soluzione specifica. Non è possibile riutilizzare impostazioni di eccezione specifiche tra le soluzioni. Ora vengono mantenute solo le eccezioni aggiunte; le eccezioni eliminate non vengono mantenute. È possibile aggiungere un'eccezione, chiudere e riaprire la soluzione e l'eccezione sarà ancora presente. Tuttavia, se si elimina un'eccezione e si chiude/riapre la soluzione, l'eccezione verrà nuovamente visualizzata.

La finestra Impostazioni eccezioni supporta tipi di eccezione generici in C# ma non in Visual Basic. Per interrompere le 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 Impostazioni eccezioni usando la procedura precedente:

Screenshot di Aggiungi eccezione generica.

Aggiungere condizioni a un'eccezione

Usare la finestra Impostazioni eccezioni per impostare le condizioni per le 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.

Annotazioni

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 Impostazioni eccezioni oppure fare clic con il pulsante destro del mouse sull'eccezione e scegliere Modifica condizioni.

    Screenshot delle condizioni di eccezione.

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

    Screenshot di condizioni aggiuntive per un'eccezione.

  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 utilizzare caratteri jolly (\*) nel nome per indicare più moduli.

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