2013-12-11 20 views
9

(Questo sembra molto simile a C# UnhandledException from another thread keeps looping, ma non sto cercando di intercettare l'eccezione qui, basta avere la possibilità di registrare qualcosa)Perché Visual Studio looping durante il debug eventi UnhandledException

ho un po 'molto semplice codice C# che imposta un gestore di eventi UnhandledException, quindi genera un'eccezione:

class Program 
{ 
    static void Main(string[] args) 
    { 
     AppDomain currentDomain = AppDomain.CurrentDomain; 
     //currentDomain.UnhandledException += new UnhandledExceptionEventHandler(currentDomain_UnhandledException); 

     currentDomain.UnhandledException += (sender, eventArgs) => 
      { 
       var exception = (Exception) eventArgs.ExceptionObject; 

       Console.WriteLine("Unhandled exception: " + exception.Message); 
      }; 

     throw new AccessViolationException("Bleurgh"); 
    } 
} 

Si comporta come mi aspetto dalla console:

Unhandled exception: Bleurgh 
Unhandled Exception: System.AccessViolationException: Bleurgh 
    at UnhandledExceptions.Program.Main(String[] args) in c:\code\sandbox\UnhandledExceptions\UnhandledExceptions\Program.cs:line 20 

Ma quando provo a eseguirne il debug in Visual Studio, entra in un loop, entra nel gestore eventi e poi si ritira per rilanciare l'eccezione.

La stessa cosa accade quando esprimo il gestore come un metodo statico distinto.

Qualche idea cosa sta succedendo?

Questo è in Visual Studio 2010. EDIT: e .NET 4.

+0

Possibili duplicati: [prima] (http://stackoverflow.com/q/11469826/395718), [secondo] (http://stackoverflow.com/q/1536954/395718), [terzo] (http: //stackoverflow.com/q/164433/395718). – Dialecticus

risposta

11

Sembra essere il comportamento dello ExceptionAssistant in modo speci fi co. Quando si continua, l'assistente disattiva lo stack di chiamate fino al punto in cui è stata generata l'eccezione, il che determina la riconsegna dell'eccezione. Presumo che ciò consenta di apportare modifiche che consentano di evitare l'eccezione.

Se in Strumenti \ Opzioni \ Debugger \ Generale deseleziona "Riavvia lo stack di chiamate su eccezioni non gestite", allora si comporterà come si comporterebbe un processo indipendente e vedrai terminare il processo.

+4

Infine, la risposta che stavo cercando l'anno scorso o giù di lì! Fino ad ora ho pensato che fosse impossibile farlo fallire nel modo giusto. – Dialecticus

1

Questo è come funziona il debugger, o per così dire, una "caratteristica". Se il processo viene creato da un debugger (F5), il debugger impedirà la chiusura del processo e indicherà la riga di codice che causerebbe la chiusura del processo. Quelle "eccezioni non gestite" sono effettivamente gestite dal debugger, quindi l'esecuzione non raggiunge mai il tuo codice.

Se il debugger è collegato al processo dopo aver creato il processo (Ctrl + F5 e quindi collegato), il debugger raggiungerà infine l'eccezione "gestore" non gestita, ma dopo aver chiuso il gestore, impedirà comunque la chiusura del processo e riportarti al punto in cui si è verificata un'eccezione.

+0

Interessante; se rimuovo il mio gestore di eventi UnhandledException, il debugger si limita anche a fare il ciclo, ripristinando nuovamente il puntatore di riga. –

+0

@TimBarrass Ho corretto la risposta. Sotto il debugger il processo diventa semplicemente "non risolvibile". – Dialecticus

+0

Grazie Dialiecticus - Penso che sia utile ma non la risposta completa. –

Problemi correlati