VB [SOURCE CODE] Global Handle: intercettare qualsiasi errore del codice

Predator

Utente Storico
11 Giugno 2007
3,203
47
1,268
900
Ultima modifica da un moderatore:
Anche il programmatore più niubbo sa quanto importante sia intercettare e gestire gli errori. Il Net offre un'ottima gestione grazie al Try Catch Finally, ma può capitare che scriviamo codice che non rientra in un Try o in altri tipi di error handler (on error...), oppure puo' essere che l'applicazione va in errore in punti dove non è proprio possibile gestire l'errore e cosi' l'applicazione crasha.

C'è un modo per intercettare in ogni caso qualsiasi errore venga generato, ora vi spieghero'.
La tecnica è definita Global Handle Exception, inutile discutere sulla estreama comodità e professionalità che ne deriva.
Prima che l'applicazione venga chiusa a causa dell'eccezione possiamo crearce file di log o altre operazioni, e prevedere un form dove chiede di inviarci le informazioni dell'errore cosi' da monitorare le nostre applicazioni e raffinarle.

in VBNET andate in proprietà del progetto (non della soluzione, del progetto!)

nella parte bassa a destra c'è il tasto [Visualizza eventi applicazione], premetelo.

ed incollate dentro questo codice di esempio:
Codice:
Namespace My
    Partial Friend Class MyApplication
        Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException
            IO.File.AppendAllText("err_" & Now.Ticks & ".txt", DateTime.Now & vbCrLf & e.Exception.ToString & vbCrLf & "======================================================")
            MsgBox("Errore Imprevisto contattare l'assistenza" & vbCrLf & "Premere OK")
        End Sub
    End Class


End Namespace
in questo caso quando eventualmente si verifica una eccezione non gestita invece di crashare e apparire la fastidiosa finestra del net (che mostra pure parte del codice), verra' mostrato un messaggio.
Ovviamente invece del messaggio potete fare il show di un form che chiede o meno di inviare i dati al programmatore, magari richiamando una pagina web che vi scrivera' il log sul server o inviando una email.

ATTENZIONE: il global handle verrà generato solo quando lanciate l'eseguibile, se runnate dentro il Visual Studio, ovviamente il debugger vi segnalera' l'eventuale eccezione escludendo il Global Handle Eception.
Per testarlo potete generare una eccezione qualsiasi per esempio un numero diviso per zero.

- - - Updated - - -

UPDATE: in C# è un pelino meno comodo ma basta aggiungere a mano l'handle nella Sub Main, la STAThread per capirci
Codice:
Application.ThreadException += new ThreadExceptionEventHandler(form1.UnhandledThreadExceptionHandler);
e questo il codice
Codice:
public void UnhandledThreadExceptionHandler(object sender, ThreadExceptionEventArgs e) {
            this.HandleUnhandledException(e.Exception);
        }


        public void HandleUnhandledException(Exception e) {
             MessageBox.Show("Si è verificato un errore");
                Application.Exit();
            }
        }
E con questo ho concluso :)

Predator
 
Scusate se mi intrometto, ma anche io feci un codice che intercettava errori handle facendo mostrare una form personalizzata (invece del classico messaggio del framework). La misi a punto unendo un paio di guide a riguardo, se volete la posto.
 
Non capisco cosa ci sia di tanto impressionante, basta accedere in ApplicationEvents.vb
e trovi la stessa cosa.

' I seguenti eventi sono disponibili per MyApplication:
'
' Startup: generato all'avvio dell'applicazione, prima della creazione del form di avvio.
' Shutdown: generato dopo la chiusura di tutti i form dell'applicazione. L'evento non è generato se l'applicazione termina in modo anormale.
' UnhandledException: generato se l'applicazione rileva un'eccezione non gestita.
' StartupNextInstance: generato quando si avvia un'applicazione istanza singola e l'applicazione è già attiva.
' NetworkAvailabilityChanged: generato quando la connessione di rete è connessa o disconnessa.