Newsgroup: it.comp.lang.visual-basic
Titolo: [VB 2008] terminare l'esecuzione senza chiudere il programma

ciao a tutti,
ho creato un oggetto db che nel costruttore richiede un dsn odbc valido 
e apre la connessione al db.
Nella form lo uso in questo modo:
Dim db As New db_uty("ODBC_nwind")
db.query("select * from customers")
Ora, se io metto un dsn errato come faccio a impedire l'esecuzione della 
riga db.query ?
Provo a spiegarmi meglio: io nel costruttore di db_uty ho giï¿œ messo try 
e catch e riesco a mostrare un messaggio di errore quando la connessione 
non va a buon fine. A quel punto vorrei stoppare l'esecuzione del 
programma nel senso di impedire la chiamata a db.query e mostrare di 
nuovo la form1 in modo che l'utente possa scegliere un altro dsn.
Come si puo' fare? Posso gestire questa cosa direttamente dal 
costruttore di db_uty o devo per forza fare una cosa tipo
Dim db As New db_uty("ODBC_nwind")
If (db.status) Then
   db.query("select nome from macro_operazioni")
End If
settando lo status nell'oggetto db_uty quando faccio la connessione?
ciao e grazie
Mauro

"Innuendo" <prova@b.c> ha scritto nel messaggio 
news:2sPen.25956$Ua....@twister2.libero.it...

Visto che se il DSN non ï¿œ valido probabilmente dell'oggetto db_uty creato te 
ne fai poco, potresti semplicemente propagare l'errore al form chiamante e 
farglielo gestire, senza mostrare messaggi all'interno della classe (che non 
ï¿œ il massimo).
Per capire se ï¿œ fallito il costruttore basta testare se la variabile oggetto 
ï¿œ nothing.
Nella classe:
    Sub New(ByVal DSN As String)
        Try
            ...
        Catch ex As Exception
            ' Eventualmente logga l'errore e lo propaga al chiamante
            Throw ex
        End Try
    End Sub
E nel form:
    Dim db As db_uty
    Try
        db = New db_uty("ODBC_nwind")
    Catch ex
        ' db rimane a Nothing
        ' Mostra il messaggio di errore "DSN non valido"
    End Try
    If db IsNot Nothing Then
        db.query("select nome from macro_operazioni")
    End If
HTH
Bye
Raf 

 settando lo status nell'oggetto db_uty quando faccio la connessione?
Questa è una possibile soluzione, un altro approccio è quello di
pasdsare il DSN al costruttore ma non fare la connessione in
automatico, e spostarla invece in una chiamata esplicita.
Personalmente è quello che, in generale, preferisco perchè non mi
piace avere costruttori che facciano subito troppe operazioni con
potenziali errori; inoltre, sebbene renda il codice un pizzico più
verboso, rende la classe più flessibile, perchè puoi ad esempio
istanziarla e passarla in giro per fare una connessione successiva
senza avere subito delle risorse occupate.
Quindi, la sintassi è praticamente identica a quella suggerita da te,
ma l'ordine delle operazioni interne è diverso:
'Questo istanzia solo l'oggetto e memorizza il DSN in una stringa
privata
Dim db As New db_uty("ODBC_nwind")
'Questo effettua effettivamente la connessione, e segnala se andata a
buon fine o meno
If db.Connect Then
   db.query("select nome from macro_operazioni")
End If
Un altro appunto; più sopra dici:
"io nel costruttore di db_uty ho già messo try e catch e riesco a
mostrare un messaggio di errore quando la connessione non va a buon
fine."
Sia che la connessione stia nel costruttore, sia in un metodo a parte
come dicevo sopra, va bene try..catch, ma *non mostrare l'errore* dal
codice della classe.
Questo te la rende implicitamente poco riutilizzabile e troppo
vincolata alla GUI; la classe dovrebbe solo registrare l'errore,
testo, codici e quant'altro, in property appropriate (tipo lo "status"
che accennavi prima), e lasciare invece al chiamante la decisione di
se e come mostrarlo all'utente... oggi può essere una WinForm con un
MessageBox, domani una pagina 
ASP.NET
, domani ancora una applicazione
console e così via...

 console e cos� via...
Grazie del consiglio, io pensavo che mettendo le msgbox di errore nella 
classe sarebbe stato meglio in quanto evitavo di dover fare i controlli 
ogni volta che uso le sue funzioni, ma non ho pensato alle implicazioni 
da te descritte ...
ciao
Mauro

 oggetto ï¿œ nothing.
Molte grazie, mi mancava proprio il Throw ex ... e non sapevo nemmeno 
questa cosa del costruttore :-)
ciao
Mauro

 End Sub
Se l'intenzione ï¿œ rilanciare l'eccezione al chiamante, sarebbe preferibile 
scrivere solo "Throw" e non "Throw ex", altrimenti lo stacktrace
dell'eccezione viene resettato.
-- 
S.

"Stevie" <jstevie__@__gmail__.com> ha scritto nel messaggio 
news:4b7be11d$0$1105$4faf...@reader4.news.tin.it...

Giusta osservazione!
Grazie
Raf