Due blocchi TRY-CATCH annidati....se va in CATCH in quello interno non...

venerdì 24 ottobre 2008 - 18.15

ravalon Profilo | Expert

Salve, mi succede questa cosa che forse è normale ma vorrei capire e risolvere...

ho una routine che inserisce un nuovo iscritto nel DB....quindi ho una procedura chiamante e la procedura che effettivamente scrive sul DB....

Entrambe le procedure sono dentro a blocchi TRY-CATCH per intercettare gli errori, ma se ho un errore nella procedura che scrive su DB, non mi intercetta poi l'errore nel TRY CATCH più esterno....

ecco il codice...

**************************************************************************************
Try
'+++ controllo esistenza utente...
If conn.VerificaConnessione(conn.ConnettiCatalogo) = False Then conn.RichiamaConnCatalogoMySQL()

Call OpDB.InserisciIscritto(CStr(Trim(txtNomeUtente.Value)), CStr(Trim(txtCognomeUtente.Value)), CStr(dtDataNascita), CStr(Trim(txtEmailUtente.Value)), CStr(Trim(txtTelUtente.Value)), CStr(Trim(txtPassword.Value)), CStr(Trim(txtCapUtente.Value)), CStr(Trim(txtCittaUtente.Value)), CStr(Trim(txtIndirizzo.Value)), CStr(Trim(txtIndirizzoRicezioneMerceUtente.Value)), CStr(Trim(txtPIVAutente.Value)), CStr(Trim(txtCodiceFiscaleUtente.Value)))

PanelConfermaRegistrazione.Visible = True
PanelRegistrazione.Visible = False
lblRegistrazioneConfermata.Text = Resources.ResourceGenerali.lblRegistrazioneConferma

Else

PanelConfermaRegistrazione.Visible = True
PanelRegistrazione.Visible = False
lblRegistrazioneConfermata.Text = Resources.ResourceGenerali.lblRegistrazioneUtenteEsistente
End If

Catch ex As Exception

If ViewMsg = True Then Gen.MostraMessaggio(HttpContext.Current.Handler, Resources.ResourceMsg.Errore, "ERRORE INSERIMENTO ISCRITTO:" & vbCrLf & vbCrLf & ex.Message & vbCrLf & vbCrLf & "Transazione annullata!")

Finally
OpDB = Nothing
conn = Nothing
End Try
*************************************************************************

ed ecco la routine che con una transazione scrive o meno sul db..inserisco solo la parte del controllo errori

*************************************************************************

transaction = Conn.ConnettiCatalogo.BeginTransaction

Try
Command.Connection = Conn.ConnettiCatalogo
Command.Transaction = transaction
Command.CommandText = strAddNew
Command.ExecuteNonQuery()
transaction.Commit()

Catch ex As Exception
Call Gen.ScriviLog("ClassOperazioniDB.InserisciIscritto", ex.Message)
transaction.Rollback()
'If ViewMsg = True Then Gen.MostraMessaggio(HttpContext.Current.Handler, Resources.ResourceMsg.Errore, "ERRORE INSERIMENTO ISCRITTO:" & vbCrLf & vbCrLf & ex.Message & vbCrLf & vbCrLf & "Transazione annullata!")

Finally
Call Conn.ChiudiConnessione(Conn.ConnettiCatalogo)
Gen = Nothing
Conn = Nothing
transaction.Dispose()
Command.Dispose()
End Try

Come potete vedere se dalla procedura interna ho un errore, la transazione viene annullata, e all'uscita mi aspetavo che l'errore fosse comunque intercettato cosi da mostra un messaggio di errore, ma non ci passa per niente!

Wamba Profilo | Expert

Ciao,
Il Catch cattura l'eccezione e in teoria in quel blocco di codice dovrebbe essere gestita. Se non sei in grado di farlo/non vuoi farlo devi propagarla "Manualmente" modificando il primo Try in questo modo

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

ravalon Profilo | Expert

Ho fatto come hai detto e l'ho messo sia nel primo blocco che in quello più interno ma non funziona e il MostraMessaggio di cui sotto non lavora....

PEPE Profilo | Senior Member

Ciao,
mi sono soffermato poco sul codice sorgente, ma dalla spiegazione credo di avere una soluzione.

Allora ho il promo blocco try

try ... ... operazioni ... ... catch ex as exception richiamo la procedura inserisciutente. finally dispose di tutto :D end try

ed ecco la procedura inserisciutente
try ... ... operazioni ... ... catch ex as exception finally dispose di tutto end try

Nel secondo catch quando fai la rollback metti come ultima istruzione

throw new exception(ex.message & "tuo messaggio")

ravalon Profilo | Expert

Ok adesso mi fa il percorso corretto, cioè uscendo dal CATCH più interno mi va al CATCH primario, però succedono due cose strane....

1) Il MostraMessaggio non funziona e non capisco perchè dato che funziona ovunque....
2) E' come se non avessi nemmeno fatto click sulla form di registrazione e noto che torna a controllare i valori dei campi di testo (che in questa pagina usano dei ValidateControl)...però i campi sono riempiti per cui non mostra errori...

Ora .... il MostraMessagio potrebbe non essere corretto, ci darò un'occhiata anche se funziona ovunque...

Ma per il resto la form sembra comportarsi in modo strano...

ravalon Profilo | Expert

Qualche idea in merito al perchè non mi fa funzionare la procedura che mostra un messaggio di errore ?
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