2009-10-29 18 views
38

Ho un codice che genera una grande quantità di ArgumentException su una particolare riga (che si trova in un codice diverso dello sviluppatore, quindi non posso cambiarlo), che vengono poi catturati e gestiti in modo appropriato.Debug di Visual Studio: ignorare l'eccezione in un punto mentre ci si rompe altrove?

Sto tentando di eseguire il debug di ArgumentException che si verificano in una sezione diversa del codice (e vengono quindi catturati e gestiti, quindi non posso solo esaminare le eccezioni non gestite).

C'è un modo per ignorare le ArgumentException provenienti da quella particolare altra riga di codice, mentre si interrompe ancora su ArgumentExceptions che vengono lanciati altrove?

+0

http://support.microsoft.com/kb/308469 – madcolor

risposta

37

Potrebbe essere possibile farlo, ma dipende da come il codice che si desidera eseguire il debug si trova rispetto al codice dell'altro sviluppatore e se è possibile modificare (ma non eseguire il commit delle modifiche) sul proprio codice.

La prima cosa che si vuole fare è, almeno temporaneamente, andare al menu Strumenti -> Opzioni -> Debug in Visual Studio, e spuntare la casella "Just My Code". Presumo che questo sia disponibile anche nelle edizioni Express, ma potrebbe non esserlo, e se non è disponibile per te, temo che il resto di quello che ho da dire probabilmente non serva.

In ogni caso, una volta inserito il segno di spunta, non verranno più visualizzate notifiche di tipo break-on-throw per il codice che non è "tuo". Ciò significa che il codice proviene da un assembly non presente nel tuo.sln o codice contrassegnato con l'attributo [DebuggerNonUserCode] da System.Diagnostics. Quello che faccio di solito è quindi decorare temporaneamente i metodi incriminati con [DebuggerNonUserCode] finché non ho finito di eseguire il debug di ciò di cui ho bisogno per eseguire il debug, e quindi di ripristinare tali modifiche prima di effettuare il check-in per il controllo della contaminazione.

Non è elegante come vorrei (mi piacerebbe un "mai rompere i lanci da questo sito di nuovo" nell'assistente eccezione), ma è meglio di niente.

Credo che ci possano essere altre impostazioni del debugger che potrebbero interagire con il funzionamento di "Just My Code", quindi se questo non funziona per te fammelo sapere e cercherò di ottenere un'immagine più accurata di quello che le impostazioni sembrano quando faccio questo.

+1

L'opzione "Solo il mio codice" non è disponibile nella finestra di dialogo Opzioni in alcune versioni Express di Visual Studio (è in Visual C# 2010 Express, però), ma può essere modificata con altri mezzi: * [Come disabilitare " Just My Code 'in Visual Basic 2005 Express?] (Http://stackoverflow.com/questions/12790806) *. –

+0

Nota che mentre l'opzione è disponibile anche per C++, non ha alcun effetto sulle eccezioni, come descritto qui: http://msdn.microsoft.com/en-us/library/dn457346.aspx – pjcard

+1

Stranamente, il [ DebuggerNonUserCode] ferma ancora il debugger nella funzione genitore: http://stackoverflow.com/questions/39382551 – crokusek

2

Se si conosce come si sta chiamando, vorrei impostare il punto di interruzione nel codice e quindi passare (F11) da lì. Puoi anche colpire il programmatore fino a quando non correggono il loro codice, il che avrebbe l'effetto di farti sentire meglio (a meno che tu non sia un pacifista) e forse non avranno così tante ArgumentException nel loro codice (che probabilmente ti farebbero sentire meglio anche se sei un pacifista).

+0

Anthony ha appena vinto Internet !!! Bene ok ... StackOverflow, non Internet. E sì, va bene ... forse 'solo' è un po 'un termine improprio considerando che questo era 4 1/2 anni fa ma ... beh ... ehm ... oh dimenticalo. Accetta la vittoria e vai avanti! – MarqueIV

3

Se si sta parlando della funzione di eccezione "Break On Throw", allora non c'è. È solo una funzionalità basata su tipo e non ha alcun modo per controllare quale sezione del codice genera l'eccezione.

La soluzione migliore è posizionare i punti di interruzione su tutte le linee che lanciano o sospendono temporaneamente lanciando un'eccezione dal luogo che interessa.

1

Sembra utilizzare le eccezioni come controllo di flusso. Se quello che si sta tentando di eseguire il debug si verifica in un secondo momento nel programma, è possibile provare a collegare il debugger in un secondo momento oppure attendere fino a quando il programma è in esecuzione per interrompere l'interruzione quando viene generata un'eccezione ArgumentException.

Cerca di limitare anche l'ambito: se l'eccezione a cui sei interessato deriva ma non è esattamente ArgumentException, interrompila invece.

Dite all'altro sviluppatore di correggere il suo codice.

Edit: In .NET 4, è possibile collegare un gestore all'evento AppDomain.FirstChanceException, filtrare excepitons non ArgumentException e filtrare il cattivo sulla base dello stack di chiamate.

0

I collegamenti nei commenti sono fantastici.

Penso che i Breakpoint condizionali siano ciò che stai cercando qui. È possibile farlo facendo clic con il pulsante destro del punto di interruzione e facendo clic sulla voce di menu Condizione ....

+0

Sfortunatamente il debugger di Visual Studio non è buono come GDB; in particolare non è possibile impostare un comando su un'eccezione per verificare una condizione e continuare se questa è l'eccezione che non avremmo voluto. –

Problemi correlati