Newsgroup: it.comp.lang.visual-basic
Titolo: Gestione dell'errore

Allora... riecchime...
ho fatto una shell "c:\...." ma il file che cerco non c'e'... e cosi' mi da
errore 53
ho pensato di gestire questo errore e mi sono affidato all'help... ma se
scrivo
shell "c:\....."
    if err.number = 53 then
        msgbox "file inesistente"
    end if
il programma si blocca e poi si chiude non riconoscendo nulla...
se scrivo:
    on error goto msg:
poi che cosa devo fare?
grazie... dove sta l'errore?

 wrote in message
bx%g6.29288$GM6.1...@news.infostrada.it...

on error resume next
shell "c:\....."
if err.number = 53 then
         msgbox "file inesistente"
end if
on error goto 0
Ciao
Sir Jo

    end if
Come vedi, la tua if non viene presa nemmeno in considerazione perchè
la esegui, o vorresti eseguirla dopo il comando shell. In realtà il
file non c'è e il programma è li che esce, ma non passa per l' if,
perchè l' errore si genera prima. Così non stai controllando l'
errore.
La soluzione per gestire l' errore, ma qualunque tipo di errore è
questa.
Private Sub Command1_Click()
    On Error GoTo ErroreShell:
    Shell "C:\Temp\Pippo.exe", vbNormalFocus
 
    Exit Sub
 
ErroreShell:
    MsgBox "Il file non esiste", vbCritical, "Prova gestione errori"
End Sub
In questo modo, qualunque errore si generi nella rouitne, e a
qualunque riga, il programma salterà sempre al paragrafo ErroreShell e
visualizza la messagebox; senza darti più un errore di run-time come
faceva prima.
Err.Number e Err.Description ni sembra già li conosci...se proprio
vuoi mettere la if. e controllare il tipo di errore, allora puoi
scrivere:
ErroreShell:
 if err.number = 53 then
    MsgBox "Il file non esiste", vbCritical, "Prova gestione errori"
 else
    .....
    .....
Un altra cosa che puoi fare, ma che ti rimane utile quando utilizzi ad
esempio una funzione, è generare te, un tuo errore. Invece che avere
la descrizione e il numero che ti da il vb, che tante volte non sono
molto chiari come errori. Ti faccio  un esempio:
Private Sub Command1_Click()
    On Error GoTo ErroreShell:
    Call LanciaExe("C:\Temp\pippo.exe")
 
    Exit Sub
 
ErroreShell:
    MsgBox "DESCRIZIONE: " & Err.Description & vbCrLf & _
           "NUMERO: " & Err.Number, vbCritical, Err.Source
End Sub
Public Function LanciaExe(ByVal strPath As String)
    On Error GoTo ErroreLanciaExe:
 
    Shell "C:\Temp\Pippo.exe", vbNormalFocus
 
    Exit Function
 
ErroreLanciaExe:
    Err.Raise 1000, "Prova gestione errori", "Il file che vuoi aprire
non esiste in questa directory."
End Function
In questo caso hai un form che un bottone dentro, e alla sua pressione
vuoi che pata il programma pippo.exe
Crei una funzione stupidissima (non che ce ne sia bisogno) che segue
il comando shell con il path che tu gli passi. Se nella funzione si
genera qualche errore, il programma salta al paragrafo
ErroreLanciaExe: e cre un errore di run-time; ATTENZIONE, lo crea, non
lo visualizza!! non hai la schermaa a video. La funzione chiamata
dalla sub, ha generetao un errore, e siccome anche nella sub, c'è un
paragrafo dove andare, se qualcosa non fa, il programma, SOLO adesso
ti visualizza la schermata con il pallino rosso in cui dentro ci
trovi:
err.description, è la descrizione che hai  messo te, e non quella di
vb, lo stesso di casi per il numero, err.number. Err.sorce, ti ritorna
'Prova gestione errori', così come titolo alla finestra di errore
appare questa scritta qua (potevi anche mettere il nome del programma
utilizzando app.filedescription) o quelli che vuoi. Come vedi, in
questa cosa, creare un proporio errore è stato utile, ma la vera
utilità la vedi quando scrivendo un programma, ti crei anche una lista
di errori tuoi, che sai perfettamente come gestire, senza dover
intercettare quelli di vb.
Questo è quanto...comunque guarda anche sulla guida, perchè io non ho
parlato di Resume Next
Saluti...

Se qualcuno è interessato, posso fornire anche la versione in italiano
del post :)) Da appena sveglio do sempre il meglio di me :)))