2009-05-06 3 views
20

In breve:Posso regolare le opzioni di Visual Studio "Interrompi quando un'eccezione viene lanciata" a livello di programmazione?

In Visual Studio 2008, il menu Debug ha un'opzione Exceptions....
Facendo clic su questo, viene visualizzata la finestra di dialogo "Interrompi quando viene emessa un'eccezione", in cui spunta la casella accanto a "Eccezioni di runtime in linguaggio comune".

Desidero poter selezionare/deselezionare questa casella a livello di programmazione.

Elaborazione:

Questo fa sì che il debugger di rompere quando viene generata alcuna eccezione CLR (non quando è catturato e ri-gettato), quindi questo è grande per la risoluzione dei problemi.

Il problema è che intercetta tutte le eccezioni CLR e il framework .NET è in grado di lanciare e catturare un gruppo di eccezioni internamente, che vengono anch'esse catturate. Questo fa sì che il debugger si interrompa su un gruppo di eccezioni a cui non mi interessa molto dato che sono interne al framework e non un problema.
WCF è in particolare male a questo e, per fortuna, la mia app utilizza WCF dappertutto.

Quello che mi piacerebbe fare, è la casella di controllo spenta, e una volta che la mia app è stata avviata (e superata la fase di connessione WCF e tutte le eccezioni interne), quindi averla accesa, per rompere tutte le eccezioni d'ora in poi.

  • So che non devo avere il pescato coperta su "tutte le eccezioni CLR", ma la lista dei possibili eccezioni è lungo circa 2 miglia e ci vuole sempre per scorrere e scegliere quelli che si desidera (e poi cosa succede se mi manca qualcuno).
+1

Avete pensato semplicemente cadere un punto di interruzione nel codice e poi manualmente accendere i Eccezioni? –

+0

Questo è quello che sto facendo. Diventa molto fastidioso dover accenderli/spegnerli manualmente ogni volta che riavvio l'app, che è quello che sto cercando di evitare –

risposta

8

Questo non indirizza direttamente la domanda, ma c'è un pratico accordo ctrl-D + E che visualizza la finestra di dialogo delle eccezioni di debug. Ctrl + Alt + E farà la stessa cosa.

1

In cima alla mia testa (quindi potrebbe essere una sciocchezza) si può impostare il debugger in modo che si interrompa solo su eccezioni CLR non gestite, quindi creare un delegato/evento di gestore per tutte le eccezioni durante il codice init e ingoiare quelle CLR (OK, OK, solo in modalità debug) e quindi rimuovere il delegato/evento nel punto nel codice in cui si desidera che VS inizi a rompere sulle eccezioni CLR.

30

È possibile accenderli/spegnerli tramite l'API di automazione di Visual Studio (denominata DTE). Dai un'occhiata all'API Debugger3.ExceptionGroups. Ad esempio:

' Turn off NullArgumentException. 
Dim debugger As Debugger3 = DTE.Debugger 
Dim exceptionGroup As ExceptionSettings = dbg.ExceptionGroups.Item("Common Language Runtime Exceptions") 
exceptionGroup.SetBreakWhenThrown(False, "System.NullArgumentException") 

Quindi è possibile scrivere facilmente una macro per attivare/disattivare specifiche eccezioni. Per richiamare la macro dall'applicazione è possibile avviare "devenv/command".

In alternativa, è possibile utilizzare DTE da out-of proc e automatizzare Visual Studio direttamente (non sono coinvolte macro).

Maggiori informazioni:

  1. Customizing exception handling in the VS Debugger
  2. Debugger3.ExceptionGroups
  3. devenv /command
  4. How to: Get References to the DTE and DTE2 Objects
+0

Cool, ora posso farlo anche io! – leppie

1

Probabilmente si può fare questo con la creazione di una macro (come mostrato nella Michael Lehenbauer s' esempio) e quindi riconfigurare il punto di interruzione a eseguire la macro e continuare l'esecuzione. Puoi fare lo stesso alla fine della sezione del codice che ti interessa per disabilitare nuovamente l'opzione, o disabilitarla manualmente tra le sessioni di debug.

0

C'è anche

se (Debugger.IsAttached) {Debugger.Break()}