2010-11-01 10 views
7

stavo pensando, è possibile "override" o forse sostituire il WinForms standar .net forma Eccezione ??Sostituzione del modulo/errore di eccezione standar in .net

Sto parlando di questo tizio:

alt text

E 'possibile, durante la portata del programma buco, per ignorare questa finestra? Intendo automaticamente, senza dover eseguire try/catch.

Grazie!

Daniel

risposta

0

Nelle webform, è possibile gestire Application_Error in global.asax. Ma sembra che tu stia parlando di winforms. In tal caso:
prova ad aggiungere il seguente codice nel tuo metodo di antipasto principale:

Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(ExceptionHandler.OnThreadException); 

E definire la classe ExceptionHandler come segue:

/// <summary> 
/// Main thread error handler. 
/// </summary> 
public sealed class ExceptionHandler 
{ 
    private ExceptionHandler() 
    {} 

    /// <summary> 
    /// Handles an exception on the main thread. 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="t"></param> 
    public static void OnThreadException(object sender, ThreadExceptionEventArgs t) 
    { 
     DialogResult result = DialogResult.Cancel; 
     try 
     { 
      result = ShowThreadExceptionDialog(t.Exception); 
     } 
     catch 
     { 
      try 
      { 
       MessageBox.Show("Fatal Error", "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop); 
      } 
      finally 
      { 
       Application.Exit(); 
      } 
     } 

     // Exits the program when the user clicks Abort. 
     if (result == DialogResult.Abort) 
      Application.Exit(); 
    } 

    // Creates the error message and displays it. 
    private static DialogResult ShowThreadExceptionDialog(Exception e) 
    { 
     string errorMsg = "An error occurred please contact the adminstrator with the following information:\n\n"; 
     errorMsg = errorMsg + e.Message + "\n\nStack Trace:\n" + e.StackTrace; 
     return MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop); 
    } 
} 

Tratto da: http://www.eggheadcafe.com/community/aspnet/2/27469/any-method-for-handling-error-globally-in-c.aspx

2

Si dovrebbe gestire entrambi i seguenti eventi:

AppDomain.CurrentDomain.UnhandledException 
Application.ThreadException 

In questi gestori è possibile visualizzare un modulo personalizzato creato dall'utente.

2

Questa è la classe ThreadExceptionDialog, che deriva dalla classe Form. Derivando da esso per alterare la finestra di dialogo è una causa persa, non è possibile accedere facilmente ai controlli incorporati. È possibile creare la propria classe derivata da Form per creare la propria finestra di dialogo altrettanto bene, basta dargli un costruttore che accetta un argomento Exception. Implementare un gestore di eventi per Application.ThreadException per visualizzarlo.

Annotare il difetto fondamentale nella finestra di dialogo. Si aspetta che l'utente faccia la scelta giusta quando ha bisogno di fare clic su un pulsante per chiudere la finestra di dialogo. Con, in generale, informazioni abbastanza oscure su cosa esattamente è andato storto. Significa qualcosa per te, raramente qualcosa di più di "oh merda" per l'utente. Fare clic sul pulsante Continua non è in genere la cosa giusta da fare.

Per evitare che l'utente debba effettuare una scelta così difficile, chiamare Application.SetUnhandledExceptionMode() nel metodo Main(), superando ThrowException in modo che l'evento non venga mai generato. Ogni eccezione non gestita ora passa attraverso AppDomain.UnhandledException. Includendo quelli che sono stati generati in un thread di lavoro, le eccezioni che non producono producono la finestra di dialogo. Scrivi un gestore di eventi per esso e visualizza e/o registra il valore di e.ExceptionObject.ToString(). Spetta a te scegliere un modo per ottenere tali informazioni alla tua scrivania, o al personale IT dell'utente, in modo da poter migliorare il tuo prodotto e possono rendere le loro macchine stabili.

0

Controllare il collegamento this.

Dalla pagina:

Introduzione

Una delle cose che mi hanno colpito quando ho iniziato a imparare .NET è stata la sua funzionalità avanzate di gestione delle eccezioni. Con questo intendo caratteristiche come un facile accesso al tipo di eccezione generata, traccia dello stack completo ed eccezioni interne. Ciò semplifica l'acquisizione di informazioni complete in quei luoghi in cui si rileva un System.Exception di primo livello. Trovo questo conveniente poiché, se non è necessario intraprendere azioni specifiche su un particolare tipo di eccezione, è noioso avere gestori di cattura successivi per ogni tipo di eccezione che può essere generata. In ogni caso, anche se si rilevano eccezioni specifiche, in genere è necessario rilevare anche System.Exception solo per proteggersi e prevenire arresti anomali del programma. Così scopro che finisco per captare System.Exception dappertutto nel mio codice. Uno scenario tipico è che in Windows Form e applicazioni Web Form ASP.NET, tutti i miei gestori di eventi non banali finiscono per contenere i blocchi System.Exception try-catch.

Il problema è che questo non ancora ingombrare il codice un po 'e non sembra davvero abbastanza di destra. C'è un modo migliore?

Problemi correlati