Newsgroup: it.comp.appl.access
Titolo: Funzionamento parziale di gestione errori

Premetto che mi capita solo su un mio database che sto sistemando 
(stiamo parlando A2010 e SO Win10)
 
Private Sub cmdCalcolo_Click()
Dim rs as Dao.recordset, db as Dao.Database
On error Goto errsub
 
--> assegnazioni e calcoli vari. Si prevede possa andare in errore ed 
infatti passa alla gestione errori
 
exsub:
	On error resume Next
	rs.close: set rs=Nothing
	db.close: set db=Nothing
	Exit Sub
errsub:
	if err.number xy
	....
	resume exsub
	endif
End Sub
 
succede che quando si verifica l'errore passa alla gestione errori 
'errsub' che rimanda all'uscita della routine. E qui si verifica l'inghippo.
Siccome l'errore si verifica prima che vengano settati sia rs che db si 
verifica un altro errore, ma l'istruzione on error resume next che 
precede dovrebbe farmi uscire dalla Sub ed invece si blocca mostrandomi 
il classico messaggio di errore n.3420 per oggetto non valido o non 
impostato.
Questo sistema l'ho sempre adottato (ho colto il suggerimento proprio su 
questo ng anni fa) ed ha sempre funzionato (e funziona tuttora su altre 
applicazioni). E su questa cosa sta succedendo?
Ho provato anche ad importare tutti gli oggetti su un nuovo database, 
ma... nisba! Problemi di SO, di bug o cosa? Su internet non ho trovato 
nulla; dalla guida in linea non ricavo nulla, e mo'...?
Spostare le istruzioni rs.close e db.close PRIMA dell'etichetta exsub: 
(come sembrerebbe logico) mi porta ad altri problemi in caso di errore. 
Non mi dilungo oltre per non essere troppo prolisso.
Qualcuno può suggerirmi qualcosa?
 
Grazie
--
mantro

mantro submitted this idea :

Nella circostanza le istruzioni:
 	rs.close: set rs=Nothing
 	db.close: set db=Nothing
servono solo se vuoi riutilizzare lo stesso nome
(rs) per definire un diverso Recordset e se vuoi
riutilizzare lo stesso nome (db) per definire un
diverso Database.
Non è il tuo caso perché l'istruzione immediatamernte
successiva è Exit Sub.
Quindi esse non servono proprio a nulla.
Non esiste santo a questo mondo che dopo un Exit Sub
riesca a tenere aperti rs e db.
 
Quindi...
 
 exsub:
    Exit Sub
 
 errsub:
 	If Err.Number = xy Then
 	    Resume exsub
    Else
        ' Se l'errore è <> xy che cosa deve fare?
        ' Se nulla definisci il programma esegue
        ' l'End Sub che trova dopo l'End If,
        ' cioè fa quel che farebbe se l'errore
        ' fosse = xy. Nel qual caso la label errsub
        ' dovrebbe contenere solo il Resume exsub.
 	End If
 
End Sub
 
Bruno

 Bruno
 
Relativamente corretto quello che dici...
I 2 Oggetti effettivamente non sono più aperti nè riutilizzabili, ma, se non distruggi l'istanza l'area di memoria ad essi riservata rimane NON RIASSEGNABILE in quanto il Pointer non è rilasciato.
Possiamo pettinare le bambole... dicendo che non ha peso, che non serve a nulla, o il contrario dire che di fatto perchè non assicurarsi della distruzione di certo non fa danni... o chi anche semplicemente perchè oggi c'è il sole...
 
Mi fermo un passo prima dicendo che così stanno le cose, ognuno poi pesa la propria conoscenza e ne dosa le azioni.
 
Chi programma in Assembler o C ha ben chiare queste cose... ed i relativi pesi.
 
@Alex 


In effetti, come dici tu, può funzionare e funziona, ma non mi piace 
avere situazioni dubbie o insicure o tipo bombe ad orologeria innescate. 
In effetti lo stesso @Alex (che ho letto prima di risponderti) conferma, 
in pratica, quanto scrissi nel mio primo post.
Quindi ritengo dover percorrere altre strade per trovare una soluzione.
Ti ringrazio comunque per il tuo interessamento in ogni caso prezioso.
 
--
mantro


Testa se la variabile oggetto di tipo Recordset è assegnata o meno...
 
If Not rs Is Nothing Then
rs.Close
Set rs = Nothing
End If
 
@Alex

 pesi.
Sei sicuro che non sia un po' anacronistica questa osservazione?
Non è che tali preoccupazioni (di allora) fossero unicamente
riferite alla carenza e al costo della RAM di quei tempi?
 
Gli auguri di buone feste te li farò quando mancherà
meno di una settimana a Natale... spero di non dimenticarmi.
 
Bruno
 
PS
Con tutto quel che si blatera sul fatto che perdiano
l'inividualità, la privacy... che il governo controlla
ogni nostra mossa e cazzate similari, vorrei proprio
vedere che si precipitassero a casa mia da un momento
all'altro le forze dell'ordine.
Sarebbe una cosa assolutamente entusiasmante... soprattutto
pensando che inevitabilmente avrebbero violato, o violerebbero,
anche la dimora di "mantro".
Beh, in fondo è lui che ha denunciato il pericolo!

 End If
 
Sì. Come parte della mia gestione di errore standard è così frequente 
che lo faccio come eccezione dalla regola di scrivere solo un comando 
per riga. Anche perché così mostra ed è quasi un'unità:
 
myExit:
     If Not rs Is Nothing Then rs.Close: Set rs = Nothing
     Exit Sub
 
-- 
Ciao
Karl
*********
Access FAQ:  
http://www.donkarl.com/it
 

Allora Karl anche tu non rispetti le regole ;-)
 
Direi ottimo anche così in effetti ha una logica.
 
 
@ALEX

Ciao Bruno,
non sono un nostalgico... il fatto che ora i PC siano più performanti non ha nulla a che vedere con l'essere meno performanti nella programmazione...
Il fatto che un oggetto non sia disponibile... non significa nulla... l'area impegnata rimane tale finché non chiudi Access se non la liberi... ed una volta chiuso allora non serve fare alcun ragionamento.
Quindi se pensi che te ne freghi della memoria perché ne hai tanta... a me va bene... sei più preciso e vuoi ottimizzare e chiudere tutto... a me va bene ugualmente.
Di certo ognuno fa ben come crede... mi sono limitato a dare un riferimento tecnico (forse).
 
@ALEX

 Direi ottimo anche così in effetti ha una logica.
 
Inoltre in casi complessi con 4 recordset fa una differenza di avere 
16-20 righe di raccolta dei rifiuti o solo 4 "normate".


 Direi ottimo anche così in effetti ha una logica.
 
Secondo me ha la "logica" di non essere immediatamente compresa;
questo almeno è l'effetto che fa su di me.
Io quella gestione d'errore, dovessi proprio scriverla,
lo farei come l'hai scritta tu, però coi TAB
(che forse nel codice reale tu stesso inserisci):
If Not rs Is Nothing Then
    rs.Close
    Set rs = Nothing
End If
 
In ogni caso, che senso ha scrivere due istruzioni quando
con una sola, la seconda, si ottiene già tutto?
Infatti compilando nell'ordine:
rs.Close
Set rs = Nothing
Access esegue e non dice nulla (secondo me sta però pensando
a qualcuno che per tenersi su i calzoni usa la cintura e
le bretelle).
 
Compilando invece nell'ordine:
Set rs = Nothing
rs.Close
Access esegue la prima però s'incazza sulla seconda (secondo me
pensando a qualcuno che teme di non aver disinnescato tutte
le bombe a orologeria).
 
Rivolgo la stessa domanda a Karl che come te è molto
rispettoso della sintassi.
 
Bruno


 
Grazie Karl sempre per la tua cortese disponibilità.
 
--
mantro

 Beh, in fondo è lui che ha denunciato il pericolo!
 
Te possino... Bruno.
Pensi che dovrò aspettarmi delle visite a Natale...?!?!?
Vabbé, vuol dire che mi costerà qualche fetta di panettone.
Pensi che basterà, o dovrò passare le festività in gattabuia?
Bah... Con i tempi che corrono forse un po' di prudenza non guasta!
Per ora... Buon Natale!
 
--
mantro
 
 


In verità non ho mai avuto l'abitudine di testare prima se la variabile 
oggetto era stata assegnata o meno.
Con il mitico (e comodo) On Error Resume Next è stato sempre facile 
"sgattaiolare" via... e proseguire per la propria strada.
Ti sono sempre grato per i preziosi suggerimenti (anche se, purtroppo, 
il mio livello di conoscenza di access, non certo paragonabile al tuo né 
a quello di altri su questo ng) non mi permette sempre di comprenderli!
 
Buon Natale!
 
--
mantro
 
 
 

mantro expressed precisely :

Ma... non saprei, comunque un'esperienza di un paio di
giorni, in compagnia, non mi dispiacerebbe.
Comunque, dovessimo passare qualche notte in gattabuia
facciano così: tu porti il panettone e io lo Champagne.
 
Auguroni anche a te, ciao.
Bruno