2013-04-08 18 views
8

Devo aprire & scrivere su circa 10 file diversi all'interno dello stesso ciclo. es:Ottenere dettagli di eccezione in Python

for i in range(0,10): 
    try: 
     a=5 
     file1 = open("file1.txt",'w+') 
     file2 = open("file2.txt",'w+') 
     #... etc 

     print(str(a),file=file1) 
     print(str(a)+"hi",file=file2) 
     # ... etc 
    except: 
     #error handling 

Ora quello che vorrei fare è essere in grado di ottenere informazioni specifiche eccezioni come ad esempio quello del file si apriva/scritta entro l'eccezione generale. Dalla mia comprensione corrente, avrei dovuto fare qualcosa di simile per ottenere ciò che voglio:

for i in range(0,5): 
    a=5 
    try: 
     file1 = open("file1.txt",'w+') 
     print(str(a),file=file1) 
    except: 
     #error handling for file1 
    try: 
     file2 = open("file2.txt",'w+') 
     print(str(a)+"hi",file=file2) 
    except: 
     #error handling for file2 

... che sta per diventare estremamente goffo e poco attraente quando devo fare questo per circa 10 file diversi . C'è un modo per ottenere (ad esempio) le informazioni sul nome del file da un'eccezione generale come nel mio primo esempio? Fondamentalmente così l'eccezione potrebbe segnalare cose come "errore durante la scrittura su file1" senza un tentativo/eccetto specificamente per le operazioni file1.

modifica: Questa è una massiccia eccessiva semplificazione dei dati scritti nel file. str (a) e str (a) + "ciao" non sono rappresentazioni veramente buone dei dati effettivamente scritti; file1 potrebbe aver bisogno di un intero hardcoded, dove file2 potrebbe richiedere una stringa formattata con più variabili. generalizzare il processo di apertura/scrittura in un ciclo non funzionerà molto bene.

risposta

1

Si parla di utilizzare un ciclo, ma in realtà non si sta utilizzando un ciclo. Usa un ciclo. In questo modo puoi scrivere ogni file, uno alla volta, all'interno di un singolo blocco try. Non sembra che tu stia facendo qualcosa con i file, tranne scrivere un valore per ognuno, quindi non è necessario tenerli tutti aperti.

for filename in ['file1.txt', 'file2.txt', ...]: 
    try: 
     with open(filename, 'w+') as f: 
      f.write(str(a)+"whatever") 
    except IOError: 
     print("Error occurred with", filename) 

Edit: Se avete cose molto diversi da scrivere per i diversi file, creare un dizionario o altra struttura di dati prima del tempo memorizzare il mapping tra file e dati, quindi utilizzare tale nel ciclo.

data = {'file1.txt': str(a), 'file2.txt': 'something else', 'file3.txt': str(a)+str(b)} 

for filename, output in data.items(): 
    try: 
     with open(filename, 'w+') as f: 
      f.write(output) 
    except IOError: 
     print("Error occurred with", filename) 
+0

I significato per il codice incluso da considerare come se fosse già in un ciclo. lo aggiusto. Ma questo non risolve il mio problema. Le cose scritte in questi file non sono necessariamente simili in alcun modo, forma o forma. file1 potrebbe aver bisogno di un "1" hardcoded stampato, il file2 potrebbe aver bisogno di una variabile stampata, e file3 potrebbe aver bisogno di più variabili. quello che finirà per accadere è una gigantesca dichiarazione di se nel "con"; per esempio. "se nomefile = file1, scrivi questo; se nomefile = file2, scrivi quello; se nomefile = file3, scrivi quest'altra cosa". Il codice sarà altrettanto clunky – user891876

+0

@ user891876: vedere la mia risposta modificata. Predisporre la relazione tra file e dati, quindi scrivere ogni parte di dati nel file associato nel ciclo. – BrenBarn

+0

cosa succede se non voglio stampare su file3 se length (str (a) + str (b))> 5? ogni file ha bisogno di una propria logica. – user891876

15

È possibile utilizzare sys.exc_info per ottenere informazioni circa l'eccezione attualmente gestita, tra cui l'oggetto eccezione stesso. Un'eccezione IOError contiene tutte le informazioni necessarie, compreso il nome del file, l'errno, e una stringa che descrive l'errore:

import sys 

try: 
    f1 = open('example1') 
    f2 = open('example2') 
except IOError: 
    type, value, traceback = sys.exc_info() 
    print('Error opening %s: %s' % (value.filename, value.strerror)) 

Esecuzione in blocco try sarà ovviamente ancora fermare dopo la prima eccezione.

1

Quando si utilizza exc_type, value, exc_traceback = sys.exc_info(), notare che il nome del file che ha generato l'eccezione può essere ottenuta attraverso la seguente:

exc_traceback.tb_frame.f_locals.get('filename') 
Problemi correlati