2013-02-20 9 views
6

Ho studiato this article on MSDN e alcune domande/risposte su SO relative a questo argomento, ma non riesco a capire perché il codice sottostante non funzioni (in un'app console di esempio).Come gestire le eccezioni in Attività con debugger?

AggregateException dovrebbe essere generata, in base a MSDN, che conterrà un'eccezione interna con il messaggio hello. Invece, questa eccezione hello non è gestita. Succede quando si trova all'interno di un debugger.

Se si preme Continua o Esegui standalone, funziona come previsto. C'è un modo per evitare di continuare a premere per tutto il tempo in VS? Dopo tutto, qualunque cosa si trovi all'interno di un blocco Try...Catch viene considerato gestito in un modello di programmazione a thread singolo. In caso contrario, il debug potrebbe essere un incubo.

VB.NET

Sub Main() 
    Try 
    Task.Factory.StartNew(AddressOf TaskThatThrowsException).Wait() 
    Catch ex As AggregateException 
    Console.WriteLine(ex.ToString) 'does not get here until you hit Continue 
    End Try 
End Sub 

Private Sub TaskThatThrowsException() 
    Throw New Exception("hello") 'exception was unhandled 
End Sub 

C#

namespace ConsoleApplication1 { 
    class Program { 
    static void Main(string[] args) { 
     try { 
     Task.Factory.StartNew(TaskThatThrowsException).Wait(); 
     } 
     catch (AggregateException ex) { 
     Console.WriteLine(ex.ToString()); //never gets here     
     } 
    } 

    static void TaskThatThrowsException() { 
     throw new Exception("hello"); //exception was unhandled    
    } 
    } 
} 

C'è qualcosa di ovvio che mi manca qui?

+0

Impostare il debugger di fermare su tutte le eccezioni. Dove si ferma? Dovrebbe fermarsi in "TaskThatThrowsException" e in "Wait". – usr

+0

@usr: anche ora si ferma alla riga 'Lancia nuova eccezione (" ciao "), controllando tutto Gettato non lo rende migliore. Vorrei che non si fermasse a questo, e piuttosto processare Console.WriteLine. In caso contrario, il debug potrebbe essere un incubo. – Neolisk

+0

Le eccezioni delle attività non vengono visualizzate in StartNew, solo in .Wait(). Dim myTask = Task.Factory.StartNew (...) Prova MyTask.Wait() Catch ... – adrianm

risposta

2

L'impostazione "Abilita solo il mio codice" ha un effetto su questo. Sotto Strumenti-> Opzioni, Debug-> Generale-> abilita Just My Code. Se è attivato, considererà l'eccezione non gestita se il tuo codice non lo gestisce. Prova a disattivare questa opzione.

See: http://msdn.microsoft.com/en-us/library/dd997415.aspx

+0

+1. Quindi sembra che questo approccio sia raccomandato da Microsoft, in questo caso specifico. Suppongo che dovrei leggere MSDN più attentamente la prossima volta, perché sono sicuro di aver dato un'occhiata veloce a questa particolare pagina prima di fare questa domanda. Grazie molto! – Neolisk

2

Ciò è molto probabile perché stai fraintendendo ciò che sta dicendo la finestra di dialogo di Visual Studio.

L'eccezione è "utente non gestito", poiché non è presente alcun codice utente che lo intercetta (l'originale Exception), viene catturato da TPL. Quindi, se permetti al debugger di continuare, o se esegui la tua applicazione senza il debugger, vedrai il comportamento che ti aspetti.

+0

+1. Bene, con le normali eccezioni, sono considerati gestiti, se all'interno di un blocco "Prova ... Catch' (e il tipo corrisponde, e non ripubblicato, ovviamente). In quale altro modo dovrei eseguire il debug della mia applicazione? La stampa continua sempre in casi simili? C'è un modo per rendere VS non catturare queste eccezioni durante il debug? – Neolisk

+1

@ Debug Debole-> Eccezioni-> Deseleziona generato – Marc

+0

@Marc: Gettato è già deselezionato ovunque. – Neolisk

Problemi correlati