ciao,
Luca.1967 ha scritto:
Con il blocco Using ho modo di intercettarlo lo stesso e di rinviare ad una pagina ben precisa?
No, devi comunque creare un blocco Try...Catch al suo interno perché il blocco Using, di per sé, non cattura le eccezioni (infatti è solo un Try...Finally, manca il Catch).
Detta così sembra che non ci siano sufficienti motivi per preferire il blocco Using ma, in realtà, il suo scopo è differente da un Try...Catch.
Lo Using risponde alla specifica necessità di liberare le risorse al termine del loro uso, anche se si dovesse verificare un errore di qualsiasi natura.
Il Try...Catch invece risponde alla necessità di eseguire del codice alternativo, che tenti di sistemare la situazione quando si verifica un'eccezione
prevedibile.
Che vuol dire "prevedibile"? Ad esempio, se invoco conn.Open() mi aspetto di ricevere una DbException se il database per un qualche motivo non fosse raggiungibile. Quindi il Try...Catch andrebbe messo attorno a questa specifica istruzione allo scopo di provare a recupare una situazione problematica. Per esempio, potrei lasciar passare un secondo e riprovare di nuovo a chiamare conn.Open(). Per "recuperare" non intendo reindirizzare l'utente ad una pagina di errore, ma proprio provare a ristabilire il normale corso dell'esecuzione di pagina.
Poi, beh, se dopo ripetuti tentativi non dovessi riuscire a risolvere il problema, allora lascio che l'eccezione si propaghi. Anzi, magari ne sollevo una io stesso incapsulando quella originale dentro la proprietà
InnerException.
Luca.1967 ha scritto:
utilizzando il try/catch/finally intercetto l'errore e lo invio ad una sub che poi scrivera' un log ed eseguo un reindirizzamento ad una pagina che informa l'utente dell'errore e rimanda in homepage
Questo certamente puoi farlo ma secondo me il logging non è tra gli scopi di un blocco Try...Catch. Anche perché, pensaci, in vari punti della tua applicazione devi fare il copia-incolla dello stesso pezzo di codice che ti invoca il CommonCode.LogErrore.
E se ti dimentichi di mettere il Try...Catch in un punto che non pensavi ti potesse sollevare un eccezione? Non verrebbe loggata. Una OutOfMemoryException può capitare ovunque.
Loggare gli errori è un
cross-cutting concern funzionalità trasversale che interessa tutte le parti del tuo codice e che perciò dovresti centralizzare in modo da occupartene solo una volta e poi mai più.
Ad esempio, per reindirizzare gli utenti quando si verifica un errore, Asp.net ti mette a disposizione l'elemento <customErrors> del web.config. Qui trovi un esempio, ti è sufficiente indicare il percorso ad una pagina html (preferibilmente) che l'utente vedrà quando si verifica un errore non gestito.
http://msdn.microsoft.com/it-it/library/h0hfz6fc%28v=vs.80%29.aspxInvece, per il logging dell'errore esistono altre possibilità. Una eccellente, ad esempio, è impiegare
ELMAH, una libreria che si occupa proprio di questo.
In alternativa, se hai già in piedi il tuo sistema di logging e vuoi continuare ad usare quello, puoi aggiungere un metodo Application_Error al tuo global.asax e ti verrà chiamato ogni volta che si verifica un errore. Qui trovi un articolo che ne parla. All'interno del metodo avrai accesso a tutti i dettagli dell'eccezione e potrai decidere di loggarla usando il tuo CommonCode.LogErrore.
http://www.aspitalia.com/script/376/Intercettare-Errori-Pagine-ASP.NET-Global.asax.aspxciao!
Modificato da BrightSoul il 08 febbraio 2012 20.20 -