Visual Studio: come interrompere le eccezioni gestite?


165

Vorrei che Visual Studio si interrompesse quando si verifica un'eccezione gestita (ovvero non voglio solo vedere un messaggio "Prima possibilità", voglio eseguire il debug dell'eccezione effettiva).

ad esempio, voglio che il debugger si interrompa all'eccezione:

try
{
   System.IO.File.Delete(someFilename);
}
catch (Exception)
{
   //we really don't care at runtime if the file couldn't be deleted
}

Mi sono imbattuto in queste note per Visual Studio.NET:

1) In VS.NET vai al menu Debug >> "Eccezioni ..." >> "Eccezioni Common Language Runtime" >> "Sistema" e seleziona "System.NullReferenceException"

2) Nella parte inferiore della finestra di dialogo è presente una casella di gruppo "Quando viene generata l'eccezione:", selezionare "Rompi nel debugger"

3) Esegui il tuo scenario. Quando viene generata l'eccezione, il debugger si interrompe e ti avvisa con una finestra di dialogo che dice qualcosa del tipo: "È stata emessa un'eccezione di tipo" System.NullReferenceException ". [Break] [Continue]"

Hit [Break]. Questo ti metterà sulla riga di codice che sta causando il problema.

Ma non si applicano a Visual Studio 2005 (non esiste alcuna opzione Eccezioni nel menu Debug ).

Qualcuno sa dove trovare questa finestra di dialogo di opzioni in Visual Studio che la casella di gruppo " Quando viene generata l'eccezione ", con l'opzione " Rompi nel debugger "?

Aggiornamento: il problema era che il mio menu Debug non aveva una voce Eccezioni . Ho personalizzato il menu per aggiungerlo manualmente.


9
In VS2015 era sotto Debug-> Windows-> Impostazioni eccezioni
PeterVermont

Mi ci è voluto un po 'per scoprire come ripristinare le impostazioni di eccezione predefinite dopo aver modificato alcune delle impostazioni di eccezione, quindi una nuova risposta. ripristinare le impostazioni delle eccezioni predefinite
Mabito

Risposte:


170

Con una soluzione aperta, vai all'opzione di menu Debug - Eccezioni ( Ctrl+ D, E). Da lì puoi scegliere di interrompere le eccezioni generate o non gestite dall'utente .

EDIT: la mia istanza è impostata con il "profilo" C # forse non è lì per altri profili?


10
non ho questa opzione. Ciò spiegherebbe la mia confusione.
Ian Boyd,

58
ho avuto il menu di debug, ma nessuna opzione Eccezioni. ho personalizzato il menu per aggiungerlo manualmente; il tasto di scelta rapida funzionava in entrambi i modi (Ctrl + Alt + E)
Ian Boyd il

3
Inoltre, è possibile ripristinare l'ambiente VS2010, andando su "Strumenti", "Importa impostazioni di esportazione" e selezionare un ripristino per l'ambiente C # ... contiene la voce Sottomenu Eccezioni
BeardinaSuit

14
Ho selezionato Common Language Runtime Exceptions> <All Common Language Runtime Exceptions not in this list>in Visual Studio 2017 e tutti i miei sogni più selvaggi si sono avverati.
Aaron Newton,

9
Visual Studio 2015: Debug -> Windows -> Impostazioni eccezioni
achecopar

47

Esiste una finestra "eccezioni" in VS2005 ... provare Ctrl+ Alt+ Edurante il debug e fare clic sulla casella di controllo "generata" per l'eccezione su cui si desidera interrompere.


Questo è esattamente quello che voglio. Dov'è quello nel menu? Per la mia vita non riesco a trovarlo.
Ian Boyd,

La scorciatoia da tastiera può cambiare in base al profilo (sviluppatore C #, sviluppatore C ++, ecc.)
Asaf R

1
Ho una voce di menu: Debug -> Eccezioni. Questo è con VS2005 Professional. Stai eseguendo un'edizione Express?
Rob Walker,

5
se si desidera la voce di menu Eccezioni: selezionare Strumenti | Personalizza .... Fai clic sulla scheda Comandi. Seleziona la categoria Debug nella casella Categorie. Trova la voce di comando Exceptions ..., quindi trascinala nel menu Debug nella parte superiore dell'applicazione, rilasciandolo nella posizione appropriata nel menu. (trovato nei commenti su: blogs.vertigo.com/personal/keithc/Blog/archive/2007/07/20/… )
sotto il

33

Mi ci è voluto un po 'per trovare il nuovo posto per le impostazioni delle aspettative, quindi una nuova risposta.

Da Visual Studio 2015 controlli quali eccezioni devono essere interrotte nella finestra Impostazioni eccezioni (Debug-> Windows-> Impostazioni eccezioni). La scorciatoia è ancora Ctrl- Alt- E.

Il modo più semplice per gestire le eccezioni personalizzate è selezionare "tutte le eccezioni non in questo elenco".

Ecco uno screenshot dalla versione inglese:

inserisci qui la descrizione dell'immagine

Ecco uno screenshot dalla versione tedesca:

inserisci qui la descrizione dell'immagine


16

Da Visual Studio 2015 e successivi, è necessario accedere alla finestra di dialogo "Impostazioni eccezioni" ( Ctrl+ Alt+ E) e selezionare "Eccezioni Common Language Runtime" (o una specifica che si desidera, ad esempio ArgumentNullException) per interrompere le eccezioni gestite .

Passaggio 1 Passo 1 Passaggio 2 Passo 2


8

Controlla Gestione delle eccezioni con la pagina Debugger , spiega come configurarlo.

In sostanza, ecco i passaggi (durante il debug):

  1. Nel menu debug, fare clic su eccezioni.

  2. Nella finestra di dialogo Eccezioni, selezionare Generato per un'intera categoria di eccezioni, ad esempio Eccezioni Common Language Runtime.

    -o-

    Espandere il nodo per una categoria di eccezioni, ad esempio Eccezioni Common Language Runtime, e selezionare Generato per un'eccezione specifica all'interno di quella categoria.


1

Una tecnica che uso è simile alla seguente. Definire una variabile globale che è possibile utilizzare per uno o più tentativi catch catch a seconda di cosa si sta tentando di eseguire il debug e utilizzare la seguente struttura:

if(!GlobalTestingBool)
{
   try
   {
      SomeErrorProneMethod();
   }
   catch (...)
   {
      // ... Error handling ...
   }
}
else
{
   SomeErrorProneMethod();
}

Trovo che questo mi dia un po 'più di flessibilità in termini di test perché ci sono ancora alcune eccezioni su cui non voglio che l'IDE si rompa.


3
Questa è una tecnica utile: trasforma l'eccezione gestita in un'eccezione non gestita, quindi il debugger si interrompe automaticamente. Non sono sicuro del motivo per cui è stato sottoposto a downgrade, a meno che non ci fosse un buon modo per impostare il tuo GlobalTestingBool. Un'altra opzione, forse migliore, è usare Debugger.IsAttached.
Joe White,

Dovresti aggiungere questo in ogni tentativo / catch e ricompilare il tuo codice. Non molto utile se sei già nel mezzo del debug di qualcosa.
Max

Un'eccezione dovrebbe essere generata nel codice se esiste una condizione eccezionale - qualcosa di inaccettabile - e dovrebbe essere presa a un livello in cui si può prendere una decisione su come gestirla. Codice come questo sopra complica i percorsi di esecuzione.
Lee Oades,

so che questa è una risposta davvero vecchia, ma per i googler casuali come me, puoi semplicemente aggiungerecatch(){/*handle or not*/ throw; } // throw without any exception specified will rethrow original exception with original callstack etc
Jan 'splite' K.

0

La documentazione online sembra un po 'poco chiara, quindi ho appena eseguito un piccolo test. Se si sceglie di interrompere l'opzione generata dalla finestra di dialogo Eccezioni, l'esecuzione del programma verrà interrotta su qualsiasi eccezione, gestita o non gestita. Se si desidera interrompere solo le eccezioni gestite, sembra che l'unica soluzione sia esaminare il codice e inserire i punti di interruzione in tutte le eccezioni gestite. Questo sembra un po 'eccessivo, quindi potrebbe essere meglio aggiungere un'istruzione di debug ogni volta che gestisci un'eccezione. Quindi quando vedi quell'output, puoi impostare un punto di interruzione su quella riga nel codice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.