2016-01-08 8 views
5

Sto creando un'utilità da riga di comando che cancellerà sottodirectory/file. Se un file è in uso, viene lanciato il numero System.IO.IOException. Io uso un blocco try-catch nel mio ciclo for.È una cattiva pratica mettere una presa di prova in un ciclo For?

Domanda:

1.Is è cattiva pratica di avere un try-catch all'interno di un ciclo?

2. Se sì, qual è un'alternativa migliore?

My Code:

System.IO.DirectoryInfo di = new DirectoryInfo(path); 

    foreach (FileInfo file in di.GetFiles()) 
    { 
     try 
     { 
      file.Delete(); 
     } 
     catch(System.IO.IOException) 
     { 
      Console.WriteLine("Please Close the following File {0}", file.Name); 
     } 

    } 
+0

Il messaggio presuppone che l'errore sia dovuto all'apertura del file. Cosa succede se il file non può essere cancellato per qualche altro motivo? –

+0

@EricLippert - Stavo pensando esattamente a questo, ma, non sono sicuro di come procedere. Come andresti sulla gestione se un file non può essere cancellato per un altro motivo? –

+0

Bene, prima, decidi se a qualcuno importa. Se a nessuno importa, non ti preoccupare. Se a qualcuno importa, la prossima cosa da fare è decidere come dirglielo. L'output della console è forse un buon modo, forse no. Difficile dire senza capire il resto del programma. La prossima cosa da fare è decidere cosa dire loro. Dì loro la verità: "file blah.txt non può essere cancellato". Considera di dare il messaggio dall'eccezione per aggiungere più contesto. Ma la verità che tu sai qui è che il file non può essere cancellato, quindi comincia da quello. –

risposta

14

No Questo può essere molto utile. Ad esempio: se non si desidera arrestare completamente il ciclo se è stata generata un'eccezione o se è presente un codice aggiuntivo che non deve essere eseguito per l'iterazione corrente a causa dell'eccezione, è possibile eseguire le seguenti operazioni.

System.IO.DirectoryInfo di = new DirectoryInfo(path); 

foreach (FileInfo file in di.GetFiles()) 
{ 
    try 
    { 
     file.Delete(); 
    } 
    catch(System.IO.IOException) 
    { 
     Console.WriteLine("Please Close the following File {0}", file.Name); 
     continue; 
    } 
    // 
    // Other Code 
    // 
} 

In questo modo è possibile registrare l'errore per rivedere in seguito, ma continuare a elaborare il resto di ciò che si stava tentando di elaborare.

+0

potresti anche usare questo fermo per fare qualcosa come cancellare il file al riavvio. http://stackoverflow.com/questions/6077869/movefile-function-in-c-sharp-delete-file-after-reboot –

+0

@Mac - Molte grazie per il codice e per aver risposto alla mia domanda. –

+2

Il 'continue' qui è superfluo; sei già alla fine del corpo del ciclo, quindi 'continue' non salta su nulla. – Servy

Problemi correlati