Newsgroup: it.comp.lang.visual-basic
Titolo: errori gestiti che non si gestiscono

Quanto lavoro vi sto dando, questi giorni :-)
Dunque, ho una routine in cui ci sono queste righe:
 For I = 0 To UBound(MatriceScN())
        Ff3 = FreeFile
        On Error GoTo NoFile
        Open Pat & MatriceScN(I) & "\messaggio.txt" For Input As #Ff3
        Line Input #Ff3, Messaggio
        If UCase(Left(Messaggio, 6)) = "IO" & MatriceScN(I) Then
            'mandare messaggio qui
            lblStatus.Caption = "Mando messaggio a " & MatriceScN(I)
        End If
NoFile:
    Err.Clear
    On Error GoTo 0
    Next I
La matrice MatriceScN() ha memorizzate, come stringhe, delle sottodirectory.
Nella variabile Pat di tipo String, c'e' memorizzato il path della directory
principale (che non e' c:\, ma ad esempio c:\mioprogramma\     anche con il
\ finale).
Vorrei che il ciclo For... Next aprisse di volta in volta un file di nome
messaggio.txt residente in ognuna delle sottodirectory memorizzate nella
matrice MatriceScN()
Il problema...
Dato che non so se in quel preciso momento il file esiste o meno, ho fatto
precedere l'istruzione Open..... da On Error GoTo NoFile.
La prima volta che il ciclo viene eseguito, tutto funziona; il proramma
prova ad aprire il file C:\mioprogramma\primasubdir\messaggio.txt       come
dato abbiamo che MatriceScN(0) = primasubdir
viene intercettato l'errore di file non trovato, viene passato il controllo
alle istruzioni dopo l'etichetta NoFile ed il ciclo riprende. Fin qui, tutto
OK.
Nel secondo ciclo ( I = 1, MatriceScN(1) = secondasuddir), l'istruzione open
mi da (giustamente) un errore, ma la gestione non viene passata
all'etichetta NoFile; sembrerebbe che il On Error Goto NoFile non avesse
efficacia.
Avete idee sul perche'?
Ciao... Maurizio

 Avete idee sul perche'?
cosě, a occhio, perchč non hai fatto un resume.
-- 
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 cosě, a occhio, perchč non hai fatto un resume.
...
Ma il resume dovrebbe far si che l'istruzione venga ripetuta. Io non vorrei
questo.
Il concetto e': se ci riesci apri il file, se questo non c'e', beh,
pazienza, salta tuto, ripeti il ciclo con un altro file (visto che cambia
MatriceScn(i) in quanto e' cambiato il valore di I), e ripeti tutto...
Cerca di aprire il nuovo file, se non c'e', chissenefrega, salta tutto e vai
al successivo.
Potrebbe anche capitare che nessuno degli I files ci sia.... pazienza, non
devo fare nulla.
Ciao... Maurizio

 vorrei questo.
no. il resume resuma dove vuoi, ma ti fa uscire dalla gestione dell'errore,
pronto quindi ad intercettarne un altro.
se non fai il resume, quindi non esci dalla gestione errori, l'errore
successivo deve essere gestito da un altro gestore attivo (tipicamente nella
routine chiamante) oppure viene trattato come "non gestito".


 NoFile non avesse efficacia.
Io ho provato. E' che, di fatto, tu ignori ogni errore.
Prova questo codice, passa-passo, è del tutto simile al tuo:
     For i = 2 To 0 Step -1
        On Error GoTo NoFile
        a = 10 / i
        MsgBox "Tutto Ok"
NoFile:
        Err.Clear
        On Error GoTo 0
    Next i

 Prova questo codice, passa-passo, č del tutto simile al tuo:
[...]
...
Provato, pero' c'e' una differenza, credo, sostanziale..
Nel tuo, mi dice OK fino a quando il valore di i e' valido, poi va in errore
e senza restituire nulla a video, continua con l'esecuzione della routine.
Nel mio esempio, l'errore di mancata apertura del file avrebbe dovuto far
continuare il ciclo (cosa che viene fatta) e ad un successivo errore la cosa
si doveva ripetere.
L'ultima operazione non viene fatta e mi viene fuori l'errore di file non
trovato (Err.Number 53 ).
Pensavo fosse stato sufficiente chiamare il Err.Clear per riattivare il
gestore degli errori (istruzione On Error), ma a quanto pare, la cosa non
basta.
Ciao... Maurizio

 cosa non basta.
Io ho il dubbio che il codice che stai provando sia quello che hai
pubblicato...

 pubblicato...
...
Beh, ora capisco il volervi mettere in difficolta' con le mie domande, ma
cosi' sarebbe perfido :-)))
In realta' ho fatto un copia-incolla prima di andare a mangiare e poi non ho
toccato piu' nulla fino alle vostre risposte. Cmq. ho seguito il metodo
suggerito da CSSoft ed ora funziona.
Posto il nuovo codice sotto il suo messaggio.
Ciao e grazie... Maurizio

 pronto quindi ad intercettarne un altro.
...
Ok, ho provato come hai suggerito, il codice e' diventato:
    For I = 0 To UBound(MatriceScN())
        Ff3 = FreeFile
        On Error GoTo NoFile
        Open Pat & MatriceScN(I) & "\messaggio.txt" For Input As #Ff3
        Line Input #Ff3, Messaggio
        If UCase(Left(Messaggio, 6)) = "VD" & MatriceScN(I) Then
            'mandare messaggio qui
            lblStatus.Caption = "Controllo macchina " & MatriceScN(I)
        End If
NoFile:
    Resume NoFile1
NoFile1:
    Next I
Cosi' Funziona.
Ciao e grazie... Maurizio

 pubblicato...
e perchè non ti convince la spiegazione che ho dato io?


 Cosi' Funziona.
dubito.
se non hai errori, ti becchi un resume senza error.
il codice dovrebbe essere, all'incirca
     For I = 0 To UBound(MatriceScN())
         Ff3 = FreeFile
         On Error GoTo NoFile
         Open Pat & MatriceScN(I) & "\messaggio.txt" For Input As #Ff3
         Line Input #Ff3, Messaggio
         If UCase(Left(Messaggio, 6)) = "VD" & MatriceScN(I) Then
             'mandare messaggio qui
             lblStatus.Caption = "Controllo macchina " & MatriceScN(I)
         End If
 NoFile1:
     Next I
 exit sub
 NoFile:
     Resume NoFile1
 End sub


 e perchè non ti convince la spiegazione che ho dato io?
Perchè mi ostinavo, distrattamente, a ritenere la mia prova corretta.
In effetti creavo due situazioni ok (che non provocavano errore) e una non
ok, esattamente il contrario di quanto avrei dovuto fare. Inoltre avevo
l'idea che On Error GoTo 0 equivalesse a ripristinare la normale gestione
dell'errore, subito seguito dalla nuova assegnazione On Error GoTo NoFile...

 assegnazione On Error GoTo NoFile...
e difatti io ho aspettato la conferma di mizio, prima di farti questa
domanda, perchč il dubbio era venuto pure a me :-)


 End sub
Sarà che non so gestire gli errori, ma codice del genere mi fa
impressione. Non sarebbe meglio ristrutturare il tutto in modo che
l'apertura file (con rispettiva gestione errori, etc.) finisca in una
Sub a parte, richiamata dal ciclo???
Ciao!

 Sub a parte, richiamata dal ciclo???
E cosa cambia, oltre alla compilcazione di restituire qualcosa al chiamante?



La leggibilità, imho.
Ciao!

 se non hai errori, ti becchi un resume senza error.
...
Si, infatti ho percorso passo passo il codice ed e' come dici :-) L'ho
corretto
Oltre all'errore "filosofico" di chiamare un resume senza che ci sia un
errore (ma.. funziona?) che problemi poteva portarmi?
Ciao... Maurizio

 La leggibilità, imho.
bah, ma non basta una semplice dir per vedere se il file esiste ?
-- 
-Gigio@Work(?)-

 bah, ma non basta una semplice dir per vedere se il file esiste ?
...
Si, infatti era una delle ipotesi di soluzione..
fare una dir, vedere se il file e' presente e se non lo e', saltare tutto.
Avevo gia' pensato a questa soluzione, pero' cosi' facendo non avrei capito
*perche'* nella prima versione la cosa non funzionava.
Mi sto divertendo a fare queste piccole applicazioni, sia perche' mi sono
utili, ma soprattutto perche' mi servono per imparare. Facendovi la
domandina, ho imparato qualche cosa di piu' :-))
Ciao... Maurizio


No, anche perche' non farei mai una cosa del genere.
Mi permetti che sfruculio sul tuo codice?
For I = 0 To UBound(MatriceScN())
    Ff3 = FreeFile
    strFilePath = Pat & MatriceScN(I) & "\messaggio.txt"
    If Len(Dir$(strFilePath)) <> 0 Then
        Open strApp For Input As #Ff3
        Line Input #Ff3, Messaggio
        If UCase(Left(Messaggio, 6)) = "IO" & MatriceScN(I) Then
            'mandare messaggio qui
            lblStatus.Caption = "Mando messaggio a " & MatriceScN(I)
        End If
    End If
Next I
Nessun bisogno di gestione dell'errore. 
Ah, poi devo dire che io ultimamente uso il Microsoft Scripting
Runtime per l'accesso al file system, e mi trovo infinitamente meglio.
Ciao!
Luca

 Runtime per l'accesso al file system, e mi trovo infinitamente meglio.
...
Ah, non so neanche cosa sia... un passo alla volta :-)
Ciao e grazie... Maurizio