Domanda

Possibile Duplicare:
.NET - Qual è il modo migliore per implementare un “prendere tutte le eccezioni del gestore”

Ho una .NET console app app che si blocca e la visualizzazione di un messaggio per l'utente.A tutti il mio codice è in un try{<code>} catch(Exception e){<stuff>} blocco, ma ancora errori, di tanto in tanto visualizzato.

In un'applicazione di Win32, è possibile acquisire tutte le eccezioni possibili crash con l'installazione di vari gestori di eccezioni:

/* C++ exc handlers */
_set_se_translator
SetUnhandledExceptionFilter
_set_purecall_handler
set_terminate
set_unexpected
_set_invalid_parameter_handler

Che cosa è l'equivalente .NET mondo, così io posso gestire/log/quiet tutti i possibili casi di errore?

È stato utile?

Soluzione

Contrariamente a ciò che alcuni altri hanno postato, non c'è niente di sbagliato la cattura di tutte le eccezioni.La cosa importante è quello di gestire tutti loro in modo appropriato.Se si dispone di un overflow dello stack o condizione di memoria insufficiente, l'app dovrebbe chiudere per loro.Inoltre, tenete a mente che OOM condizioni è possibile evitare che il gestore di eccezioni da eseguire correttamente.Per esempio, se il vostro gestore di eccezioni visualizza una finestra di dialogo con il messaggio di eccezione, se sei fuori di memoria, potrebbe non essere abbastanza di sinistra per la finestra di visualizzazione.Migliore per accedere e spegnere immediatamente.

Come gli altri citati, ci sono i UnhandledException e ThreadException eventi che è possibile gestire per la raccolta delle eccezioni che potrebbero altrimenti ottenere perso.Quindi gettare un gestore di eccezioni in tutto il ciclo principale (supponendo un form di windows app).

Inoltre, si dovrebbe essere consapevoli del fatto che OutOfMemoryExceptions non sono sempre buttato per condizioni di memoria insufficiente.Un OOM condizione può attivare tutti i tipi di eccezioni, nel codice, o nel quadro, che non necessariamente hanno a che fare con il fatto che la reale condizione di base è a corto di memoria.Ho visto spesso InvalidOperationException o ArgumentException quando la causa è in realtà di memoria.

Altri suggerimenti

È possibile aggiungere un gestore eventi per AppDomain.UnhandledException evento, e sarà chiamato quando viene generata un'eccezione, e non catturato.

Questo articolo codeproject dal nostro host Jeff Atwood è ciò di cui avete bisogno.Include il codice per intercettare le eccezioni non gestite e migliori pratiche per la visualizzazione delle informazioni sull'incidente per l'utente.

Il Globale.asax la classe è la vostra ultima linea di difesa.Guardate:

protected void Application_Error(Object sender, EventArgs e)

metodo

Essere consapevoli del fatto che alcuni eccezione sono pericolosi per la cattura - o quasi imprendibile,

  • OutOfMemoryException:qualsiasi cosa tu faccia nella cattura gestore potrebbe allocare memoria (gestito o non gestito lato del CLR) e quindi provocare un altro OOM
  • StackOverflowException:a seconda che il CLR rilevato abbastanza presto, si potrebbe ottenere notificato.Scenario peggiore, semplicemente si interrompe il processo.

È possibile utilizzare il dominio di applicazione.CurrentDomain.UnhandledException per ottenere un evento.

Anche se la cattura di tutti eccezioni senza il piano di gestire correttamente la loro è sicuramente una cattiva pratica, penso che un'applicazione deve riuscire in qualche modo elegante.Un incidente non deve spaventare l'utente a morte, e almeno dovrebbe visualizzare una descrizione dell'errore, alcune informazioni per segnalare al supporto tecnico di roba, e, idealmente, un pulsante per chiudere l'applicazione e riavviare.In un mondo ideale, l'applicazione dovrebbe essere in grado di scaricare su disco i dati dell'utente, e quindi provare a recuperare (ma vedo che questo è chiedere troppo).

Comunque, io di solito uso:

AppDomain.CurrentDomain.UnhandledException

Si può anche andare con l'Applicazione.ThreadException Evento.

Una volta stavo sviluppando un .NET app in esecuzione all'interno di un COM, sulla base dell'applicazione;questo evento è stato molto utile, come dominio di applicazione.CurrentDomain.UnhandledException non funziona in questo caso.

Penso che, invece, dovrebbe nemmeno prendere tutte le Eccezioni, ma meglio lasciare loro essere mostrato all'utente.La ragione di questo è che si dovrebbe solo prendere Eccezioni che si può effettivamente gestire.Se si esegue in alcuni Eccezione che provoca l'arresto del programma, ma ancora prenderlo, questo potrebbe causare problemi molto più gravi.Leggere anche FAQ:Perché FxCop in guardia contro catch(Exception)?.

Essere consapevoli del fatto che la cattura di queste eccezioni non gestite possono modificare i requisiti di sicurezza dell'applicazione.L'applicazione potrebbe smettere di funzionare correttamente in alcuni contesti (se eseguito da una condivisione di rete, etc.).Assicurati di testare a fondo.

non male per usare entrambi Dominio di applicazione.CurrentDomain.UnhandledException Applicazione.ThreadException

ma tenere a mente che eccezioni thread secondari non sono preso da questi gestori;utilizzare SafeThread per i thread secondari, se necessario

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top