Visualizza la versione completa : [VB.NET] Gestione errori globale in un'applicazione
Veronica80
12-01-2011, 14:00
Ciao ragazzi mi chiedevo....esiste per caso una classe...o una funzione che consente di gestire gli errori in qualsiasi porzione del codice senza dover incollare la gestione caso per caso...
tipo un "handler" che mi tiene d'occhio il software ovunque io sia e se scatta l'eccezione me la gestisce (in modo generico intendo) e mi evita il crash del programma!
Personalmente, sconsiglio di utilizzare questo genere di pratica perché è sempre meglio delegare la gestione di un errore a uno specifico blocco Try...Catch preposto a questo scopo.
Ad ogni modo, forse potresti dare un'occhiata all'evento Application.ThreadException (http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.a spx).
In generale, poi, esistono componenti di terze parti per gestire questa problematica a livello molto alto, ad esempio inviando automaticamente la segnalazione dell'errore a un bug tracker conosciuto, o a un indirizzo email, per mettere a conoscenza del bug lo sviluppatore che così può prendere i relativi provvedimenti.
Ciao! :ciauz:
Prova a vedere qui (http://totemslair.org/guide/viewchapter.php?guida=vb&id=106), quando parla del My.Application
Comunque sconsiglio anch'io questa tecnica in quanto si può fare poco più che segnalare l'errore alll'utente.
:ciauz:
Veronica80
18-01-2011, 13:54
scusate ma non ho ancora capito come muovermi :(
Il motivo per il quale vorrei gestire io la segnalazione è per evitare che il programma crashi!
Vi faccio une esempio! Se mi da un errore me lo segnala con la classica finestrella coi dettagli e mi dice: Chiudi o Continua. Se continuo non funziona più nulla se clicco "chiudi" non chiude nulla (questo sul Win 7 64bit) e devo avviare il task manager ecc ecc
Invece io vorrei che l'errore fosse si segnalato ma che non succedesse sto ambaradan...tipo mettere un exit sub o cose del genere dopo l'errore...
non so se mi son spiegata bene come al solito è un macello esporre il problema :(
Hai due scelte:
1)-Apri il tuo progetto, vai su Esplora Soluzioni->My Project->Applicazione->Visualizza Eventi Applicazione e leggi le righe del commento.
2)-Per ogni routine metti un Try...Catch...Finally
A te la scelta, ma tieni conto che se scegli la prima potrebbero esserci una seria di conseguenze a catena sulla tua applicazione.
:ciauz: :ciauz:
Il fatto che su Continua il programma non continui potrebbe essere dovuto a una gestione errata delle eccezioni, che in alcuni casi tollera uno stato non congruente del programma.
In genere, almeno per quanto riguarda la mia esperienza, la possibilità di continuare difficilmente fa crashare il programma, poiché la finestra viene mostrata al sollevamento di un'eccezione con la quale si risale lo stack delle chiamate fino al ripristino delle condizioni di normalità.
E' possibile quindi che vi sia qualche oggetto che viene modificato nel proprio stato e, a causa dell'errore (che sia gestito o no), questo rimanga nello stato intermedio o non valido impedendo al programma di funzionare correttamente nonostante la prosecuzione.
Per evitare infine la finestra dell'errore, è sufficiente gestire nel modo opportuno (con le modalità già suggerite) gli errori più frequenti evitando che siano presentati come eccezioni non gestite.
Ciao! :ciauz:
StefanoV
31-01-2011, 18:43
Metti all'inizio:
On Error Resume Next
è un po obsoleto come codice ma funziona, devi togliere i try catch da quella sub ovviamente ...
Originariamente inviato da StefanoV
Metti all'inizio:
On Error Resume Next
è un po obsoleto come codice ma funziona, devi togliere i try catch da quella sub ovviamente ...
Un pò obsoleto?? :confused:
Questa è roba da vb6: in VB.NET è molto più corretto ed appropriato usare il Try...Catch...Finally. :old:
:ciauz: :ciauz:
StefanoV
01-02-2011, 14:55
Originariamente inviato da ShaleN
Un pò obsoleto?? :confused:
Questa è roba da vb6: in VB.NET è molto più corretto ed appropriato usare il Try...Catch...Finally. :old:
:ciauz: :ciauz:
Lo so, appunto ho detto che è obsoleto :madai!?:
Però è l'unico modo per gestire gli errori in tutta la sub senza usare try catch in ogni parte del codice...
mardok30
02-02-2011, 21:03
Con "On Error Resume Next" non gestisci l'errore, diciamo che lo ignori. IMHO andrebbe usato solo se si è sicuri. Non è da sostituire al Try...Cath
Comunque, a parte l'utilizzo del Try...Catch che ti permette di gestire tutte le eccezioni nelle singole funzioni(metodo migliore), io uso
AddHandler Application.ThreadException, AddressOf GestoreEccezioni
Public Sub GestoreEccezioni(ByVal sender As Object, ByVal e As Threading.ThreadExceptionEventArgs)
'Qui ci metti tutta la gestione delle eccezioni non gestite nelle funzioni, con la possibilità di continuare a lavorare(rischiando di lavorare in uno stato di incoerenza e perdere tutto) o di uscire dall'applicazione.
End sub
Ciao