2015-11-25 15 views
5

Ho letto in this post che per evitare la finestra di dialogo "il programma ha smesso di funzionare", devo rilevare l'eccezione non gestita dall'AppDomain.Eccezione non gestita, mostra ancora la finestra di dialogo "programma interrotto"

public Form1() 
{ 
    ///Code 
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
    ///more code 
} 

    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     var excep = e.ExceptionObject; 

     //Writing the exception to log file with the stack flow 
     Logger.Logger.LogException("UNHANDLED EXCEPTION:"+Environment.NewLine +excep.ToString(), this); 

     //Terminate the logger (manual event waiting for file write to finish) 
     Logger.Logger.Terminate(); 
     Environment.Exit(1); 
    } 

Ma quando ottengo l'eccezione inalata. Posso vederlo scritto sul registro, ma l'applicazione mostra la finestra di dialogo "il programma ha smesso di funzionare". può essere causato dalla linea Logger.Terminate? (di nuovo - il comando di terminazione attende fino a quando tutti i registri sono stati scritti nel file di registro)

+1

È possibile che anche il gestore eventi si blocchi. Quel metodo Terminate() sembra piuttosto rischioso. Anche Environment.Exit() può fallire, esegue ancora i finalizzatori. O qualcosa di stupido come un bug nella classe Logger, non migliorerà quando lo utilizzerai nel gestore di eventi. In generale, qualcosa di brutto è accaduto nel tuo programma, quindi le probabilità che possa destabilizzare il tuo gestore di eventi non sono mai pari a zero. Sei anche abbastanza in ritardo nell'iscriverti, dovrebbe essere fatto nel metodo Main() prima di fare qualsiasi altra cosa. –

+0

È anche possibile che il gestore eventi non venga mai chiamato. Alcune eccezioni ('StackOverflowException') possono eliminare l'intero processo prima che qualsiasi gestore abbia la possibilità di eseguirlo. – hvd

+0

Ragazzi- Vedo l'eccezione non gestibile nel file di registro e anche la finalizzazione del file di registro. quindi questo evento viene elaborato. Inoltre ho nel main lo stesso evento catch sull'eccezione di Thread (grazie!) – Izikon

risposta

0

Idealmente, si desidera evitare la finestra di dialogo "il programma ha smesso di funzionare" perché, beh, si desidera evitare la condizione di "programma inattivo" iniziare con. In caso contrario, se si desidera solo registrare l'errore e lasciare che il programma termini correttamente, il programma deve terminare in modo naturale.

Se si esce dal programma con Environment.Exit(1), si sta praticamente dicendo al sistema operativo "hey, I bugged out!", Che è l'opposto di una terminazione elegante. Prova a uscire con un codice 0 e vedere se fa alcuna differenza.