2013-06-04 11 views
11

Ho il seguente codice:arresto visual studio di rompere l'un'eccezione in Attività

Task load = Task.Factory.StartNew(() => {//Some Stuff Which Throws an Exception}); 

try 
{ 
    load.Wait(); 
} 
catch (AggregateException ex) 
{ 
    MessageBox.Show("Error!"); 
} 

Quando mai viene generata un'eccezione nel Task, voglio che bolla cadere nella cattura tentativo invece di visuale lo studio si rompe nel punto in cui viene generata l'eccezione.

ho provato google e un po 'mi ha suggerito aggiungi a [DebuggerHidden] sulla parte superiore del mio metodo, ma non funziona

+0

Oh, amico, questo mi ha confuso. Pensavo che la mia eccezione non venisse catturata affatto, ma piuttosto la rottura automatica è solo prematura e può essere continuata. Sembra davvero un cattivo comportamento predefinito. Il messaggio di errore sembra chiaramente sbagliato, dal momento che afferma che l'eccezione non è stata presa in considerazione, ma che continuando a farlo si otterrà perfettamente. – Kat

risposta

22

Ok ho scoperto come si fa. La risposta è proprio here nella sezione della nota

Quando "Just My Code" è abilitato, Visual Studio, in alcuni casi si romperà sulla linea che genera l'eccezione e visualizza un messaggio di errore che dice "eccezione non gestita da codice utente. " Questo errore è benigno. È possibile premere F5 per continuare e visualizzare il comportamento di gestione delle eccezioni dimostrato in questi esempi. Per impedire a Visual Studio di infrangere il primo errore, deselezionare la casella di controllo Abilita solo il mio codice in Strumenti, Opzioni, Debug, Generale.

0

Per disattivare tappa eccezioni premere "Ctrl + Alt + E". Questo aprirà la finestra delle eccezioni. Deselezionare "Common Language Runtime Exceptions - Gettato".

+1

Ciò impedirebbe la pausa all'interno del delegato, ma non quando è retrocesso su "Aspetta". – Servy

6

Dal punto di vista del VS non c'è davvero alcuna differenza tra l'eccezione che viene lanciata da un passaggio delegato a un compito da qualsiasi altra eccezione.

Non c'è modo di risolverlo nel caso generale.

Tuttavia, l'unica cosa che si potrebbe fare è sfruttare il fatto che quando l'eccezione viene ridistribuita è racchiusa in un AggregateException. Potresti interrompere quando viene lanciato un AggregateException ma non altre eccezioni.

Si può andare a Debug -> Eccezioni, deselezionare tutte le eccezioni CLR, ma poi riattivare eccezioni aggregati:

enter image description here

Sarà ora non mettere in pausa nel corpo Task ma si metterà in pausa il debugger quando chiami Wait.

Lo sfortunato effetto collaterale è che ora non dovrai più mettere in pausa altre eccezioni nel tuo programma, anche se non sono in un delegato passato a Task.

+0

Oh bene, questo è sfortunato, ma mal sopportarlo. Grazie per la tua risposta! – Krimson

Problemi correlati