WinForms e gestione degli errori

venerdì 04 settembre 2009 - 11.14

volperubbia Profilo | Senior Member

Ciao a tutti,
sviluppo abitualmente su ASP.NET, sulle windows forms sono ancora alle prime armi.
Volevo implementare una gestione personalizzata degli errori, qualcosa di simile a quanto
si ottiene lato web con l'evento Application_Error del global.vb e il tag <customErrors />
del web.config.
Pensavo di creare un form personalizzato da far aprire nel caso di exception non gestite.
E' la strada giusta? C'è qualcosa di simile all'Application_Error per poter gestire questo
comportamento?

Grazie per l'attenzione,
Davide

tonyexpo Profilo | Senior Member


Ciao

bella la tua domanda.... ;) in effetti se ne parla poco...

allora: per gestire un errore "non gestito" in genere (console,servizi,dll....) puoi usare l'evento UnhandledException della classe AppDomain.
es: AppDomain.CurrentDomain.UnhandledException += ................. (in vb usi addhandler)

in winforms, usi invece l'evento Application.ThreadException

PS: quando sei in debug il debugger appunto si blocca comunque sull'eccezione.
eseguendo senza debug invece catturi correttamente l'errore.


comunque, se ti interessa l'argomento e vuoi approfondire, è descritto bene nell'msdn alla voce unhandledexception dell'appdomain.

ciaooooooo
Antonio Esposito
MCTS .NET 3.5 WCF
MCTS .NET 3.5 Windows Forms
MCTS .NET 2.0 Distributed applications
MCP

volperubbia Profilo | Senior Member

Ciao Antonio, grazie.
Allora si può fare una cosa del genere ...

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
AddHandler Application.ThreadException, AddressOf CustomErrorHandler

Private Sub CustomErrorHandler(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs)
' MIA GESTIONE DELL'ERRORE
' ..................................
End Sub

Fin qui tutto ok.

Dal momento però che sono in un progetto Windows Forms, dove va aggiunto questo codice?
Qui, credo, non ho una Sub Main() dove poterlo inserire. Ho provato a metterlo nel New del
form di avvio, ma mi restituisce l'errore "Una volta creati controlli nel thread, non è possibile
modificare la modalità eccezioni del thread".

Qualche idea?
Davide

tonyexpo Profilo | Senior Member



>Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
ti va in eccezione solo questo rigo che poi è inutile perchè è esattamente l'opzione che già hai.
in alternativa potresti disattivarlo mettendo UnhandledExceptionmode.ThrowException, in quel caso dovresti catchare gli errori nell'apppool.unhandledexception anche in windows forms, ma appunto come da errore che ricevi devi farlo prima di avviare l'oggetto application.
ti spiego: quando un applicazione winform si avvia è il form a fare da oggetto di avvio. (il tuo caso)
in alternativa, per avere più controllo, puoi avviare l'applicazione da un metodo Main() come per consoleapplication, e da li fare application.Start(il tuo form di avvio)....

prima di questo start, dovresti mettere il tuo codice di sopra.



ps: comunque va bene metterlo nel costruttore del form di avvio, poi varrà per tutto il thread e quindi anche gli altri form


bye
Antonio Esposito
MCTS .NET 3.5 WCF
MCTS .NET 3.5 Windows Forms
MCTS .NET 2.0 Distributed applications
MCP

volperubbia Profilo | Senior Member

Perfetto
Ho risolto con poche righe di codice nel form principale / di avvio e creando poi
un form ad hoc per la visualizzazione dell'errore.

Public Class frmAvvio

Private Shared Sub CustomErrorHandler(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs)
Using obj As New frmError
obj.Exception = e.Exception
obj.ShowDialog()
End Using
End Sub

Private Sub frmAvvio_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
AddHandler Application.ThreadException, AddressOf CustomErrorHandler
' ...........
' ............
End Sub

End Class

In allegato trovi un immagine del risultato.
Ciao!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5