Dove stampi i messaggi di errore IO da un'app console?

2

Sto scrivendo una semplice app per console per rinominare un gruppo di file / cartelle e voglio progettare questa app per console come più modulare possibile.

L'app per console è semplice quanto basta: chiedi all'utente quale sia il percorso della cartella di origine, a cosa vogliono rinominare la cartella e quando l'utente preme Invio. L'app trova quindi la cartella e inizia a rinominare in modo ricorsivo tutti i file / le cartelle all'interno delle sottocartelle.

Se la situazione si verifica dove l'utente deve digitare un percorso di cartella che non esiste, allora ad un certo punto voglio che l'app stampi "Impossibile trovare la cartella" all'utente. È qui che arriva la mia domanda: dove dovrebbe essere stampato questo messaggio di errore? Posso pensare a diverse opzioni:

  1. Verifica se la cartella esiste prima di chiamare la chiamata RenameFolder(string folderPath, string newName) . Stampa il messaggio di errore in questa cartella esiste controllo
  2. Vai avanti e chiama immediatamente RenameFolder(string folderPath, string newName) , ma se non trova una cartella all'interno di quella funzione, restituisci un codice di errore o enum a significare che non è in grado di trovare la cartella. Il chiamante riconoscerebbe quindi questa enumerazione e stamperà un messaggio di errore.
  3. Inserisci un assert all'inizio della funzione. Se l'affermazione fallisce, quindi stampare il messaggio di errore. Tieni presente che ciò interromperà l'esecuzione del programma se viene generato l'avviso.
  4. Inserisci un'istruzione if all'inizio della funzione controllando se la cartella esiste e, in caso contrario, stampa il messaggio di errore in tale controllo e torna.
  5. Metti un try / catch all'interno della funzione, fai in modo che l'eccezione sia lanciata, e nel comando catch stampa il messaggio di errore e poi ritorna.

Non riesco a decidere in che modo si crea il codice più "modulare". Quali sono i pensieri del tuo ragazzo?

    
posta GabeMeister 14.06.2016 - 02:03
fonte

1 risposta

5

C'è un problema con 1, 3 e 4: la cartella può essere cancellata tra il tuo assegno e quando provi ad aprirlo. Oppure la rete potrebbe morire, o le autorizzazioni potrebbero mettersi in mezzo, ecc. Interagire con il filesystem è una grande fonte di eccezioni esogene .

Decidendo tra 2 e 5, lo stile C # è generalmente quello di evitare di restituire i codici di errore, quindi non lo consiglierei 2. L'opzione 5 va bene, specialmente per un programma di piccole dimensioni, ma potresti voler lanciare l'eccezione al chiamante e mantenere l'interazione dell'utente lontano dalla logica del programma.

Quindi il flusso finale potrebbe essere simile a questo:

var filename = GetFilename();
var newFilename = GetTarget();

try
{
    renameFile(filename, newFilename);
}
catch (IOException e)
{
    PrintError(e);
}
    
risposta data 14.06.2016 - 02:19
fonte

Leggi altre domande sui tag