Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    110

    [VB.NET] Try-catch e controllo del flusso

    Ciao a tutti, è possibile riprovare l'istruzione che ha generato l'eccezione? Vi spiego il quesito: devo scrivere un file e se il percorso non esiste vorrei creare le directory mancanti nella gestione delle eccezioni e poi riprovare. Vorrei evitare di avere codice ripetuto, come si può fare?

    La mia funzione:
    codice:
    Public Function WriteAllFromString(ByVal pValue As String) As Boolean
        Dim FileWriter As System.IO.StreamWriter
    
        Try
            'Istanzio l'oggetto stream per la scrittura del file
            '...se il percorso non esiste lo creo nella catch
            FileWriter = New System.IO.StreamWriter(NamePathFile)
            'Questa try l'ho inserita per prova
            Try
                FileWriter.Write(pValue)
                FileWriter.Close()
            Catch ex As Exception
                'L'errore lo gestisco con la catch principale
                Throw
            End Try
        Catch exIO As System.IO.DirectoryNotFoundException
            'Creo la directory dal percorso senza nome file
            System.IO.Directory.CreateDirectory(NamePathFile.Substring(0, NamePathFile.LastIndexOf("\")))
            'Dopo la creazione del percorso vorrei continuare dal punto in cui si è presentata l'eccezione
            '...ma esegue la finally
        Catch ex As Exception
            MsgBox(ex.ToString, MsgBoxStyle.Critical)
            Return False
        Finally
            FileWriter = Nothing
        End Try
    
        Return True
    End Function
    Grazie
    Ciao
    Marco

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    ex.Message -> messaggio dell'eccezione
    ex.Source -> nome dell'applicazione che ha generato l'eccezione
    ex.TargetSite -> nome del metodo/funzione che ha generato l'eccezione

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    134
    scusa ma potresti prima verificare se il file esiste, all'inizio della tua funzione, utilizzando la funzione exist... tipo così:

    if not file.Exists(NamePathFile) then
    'codice che crea la cartella
    end if

    e poi il tuo try...catch modificando il catch...
    o non ho capito bene?

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,461
    Basta racchiudere in Try...Catch solo l'istruzione che provvede a creare il file, gestendo l'eventuale errore con l'impostazione di un qualsivoglia "flag" (o altra variabile) in grado di segnalare il problema, che viene poi risolto successivamente nel modo che si preferisce.

    Dov'è il problema?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    110
    Nessun problema, volevo solo essere sicuro di non perdere qualche funzionalità. Credo che non sia possibile fare quello che chiedevo per evitare i loop all'interno della gestione delle eccezioni (cosa che accadeva col vecchio VB6). Ci sono sempre tanti modi per ottenere un risultato e volevo capire la strada migliore, ho applicato i vostri consigli, cosa preferite tra :

    Alternativa 1 (si risolve con il catch):
    codice:
    Public Function WriteAllFromString(ByVal pNamePathFile As String, ByVal pValue As String) As Boolean
        Dim FileWriter As System.IO.StreamWriter
        Dim exLoopWriter As Boolean = True
        Do
            Try
                'Istanzio l'oggetto stream per la scrittura del file
                '...se il percorso non esiste lo creo nella catch
                FileWriter = New System.IO.StreamWriter(pNamePathFile)
                FileWriter.Write(pValue)
                FileWriter.Close()
                exLoopWriter = True
            Catch exIO As System.IO.DirectoryNotFoundException
                'Se non esiste creo il percorso (dalla variabile elimino il nome file)
                System.IO.Directory.CreateDirectory(pNamePathFile.Substring(0, pNamePathFile.LastIndexOf("\")))
                exLoopWriter = False
            Catch ex As Exception
                MsgBox(ex.ToString, MsgBoxStyle.Critical)
                Return False
            Finally
                FileWriter = Nothing
            End Try
        Loop Until exLoopWriter
    
        Return True
    End Function
    Alternativa 2 (si risolve con un test esistenza directory):
    codice:
    Public Function WriteAllFromString(ByVal pNamePathFile As String, ByVal pValue As String) As Boolean
    
        Dim FileWriter As System.IO.StreamWriter
        Try
            'Controllo l'esistenza del percorso ed eventualmente creo le directory mancanti
            Dim PathFile As String = pNamePathFile.Substring(0, pNamePathFile.LastIndexOf("\"))
            If System.IO.Directory.Exists(PathFile) Then
                System.IO.Directory.CreateDirectory(PathFile)
            End If
            'Istanzio l'oggetto stream per la scrittura del file
            '...se il percorso non esiste lo creo nella catch
            FileWriter = New System.IO.StreamWriter(pNamePathFile)
            FileWriter.Write(pValue)
            FileWriter.Close()
        Catch ex As Exception
            MsgBox(ex.ToString, MsgBoxStyle.Critical)
            Return False
        Finally
            FileWriter = Nothing
        End Try
    
        Return True
    End Function
    Forse è meglio evitare di passare per il try-catch, come dice la sua funzione, deve gestire le eccezioni (anche se, se vogliamo, la mancanza della cartella nel mio caso lo è). A livello di prestazioni cambierà qualcosa? Bo
    Ciao
    Marco

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,461
    Originariamente inviato da marcomd
    Ci sono sempre tanti modi per ottenere un risultato e volevo capire la strada migliore, ho applicato i vostri consigli, cosa preferite tra [...]
    A mio avviso, racchiudi troppe istruzioni nel blocco Try...Catch inerenti ad operatività sul file, per poi intercettarle in un punto che però riporta un errore generico.

    Se vuoi intercettare errori specifici (impossibile creare il file, impossibile scriverci informazioni, ecc.) devi discriminare le classi di eccezione nel blocco Catch, oppure racchiudere ogni "step" del processo in un blocco Try...Catch (non lo consiglio), e nel caso in esame aggiungere eventualmente anche un Try...Finally per garantire il rilascio delle risorse (il file) anche in caso di errore.

    Consulta anche la guida MSDN sui costrutti per ottenere esempi e ulteriori delucidazioni.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    110
    C'è il finally nella try, forse non ho capito cosa intendi
    E' vero, c'è solo la catch generica, potrei precederla con una specifica per file, ma cosa cambia?
    Ho racchiuso tutto nella stessa try perchè le operazioni sono collegate ed al primo errore deve annullarsi l'operazione, anzi, ora mi spingo oltre: sto mettendo a punto la mia classe per i files, mi piacerebbe gestire il rollback ma non so se il file system lo gestisce
    Ciao
    Marco

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.