wake-up-neo.net

Ausnahmedetails in Python abrufen

Ich muss ungefähr 10 verschiedene Dateien in derselben Schleife öffnen und schreiben. Z.

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

Nun möchte ich in der Lage sein, bestimmte Ausnahmeinformationen zu erhalten, z. B. in welche Datei innerhalb der allgemeinen Ausnahme geöffnet/geschrieben wurde. Nach meinem derzeitigen Verständnis müsste ich so etwas tun, um das zu erreichen, was ich will:

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

... was extrem unbeholfen und unattraktiv wird, wenn ich dies für ungefähr 10 verschiedene Dateien machen muss. Gibt es eine Möglichkeit, die Dateinameninformationen aus einer allgemeinen Ausnahme wie in meinem ersten Beispiel zu holen? Grundsätzlich könnte also die Ausnahme Dinge wie "Fehler beim Schreiben in Datei1" ohne einen Versuch/außer bei Operationen mit Datei1 melden.

bearbeiten: Dies ist eine massive Vereinfachung der Daten, die in die Datei geschrieben werden. str (a) und str (a) + "hi" sind keine wirklich guten Darstellungen der tatsächlich geschriebenen Daten; file1 benötigt möglicherweise eine hartcodierte Ganzzahl, wobei file2 einen mit mehreren Variablen formatierten String benötigen kann. Den Eröffnungs-/Schreibvorgang in einer Schleife zu verallgemeinern, wird nicht sehr gut funktionieren.

14
user891876

Sie können sys.exc_info verwenden, um Informationen zu der aktuell behandelten Ausnahme zu erhalten, einschließlich des Ausnahmeobjekts. Eine IOError-Ausnahme enthält alle erforderlichen Informationen, einschließlich des Dateinamens, der Fehlernummer und einer Zeichenfolge, die den Fehler beschreibt:

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))

Die Ausführung im try-Block wird offensichtlich nach der ersten Ausnahme immer noch angehalten.

25
Cairnarvon

Verwenden Sie das Modul traceback :

traceback.print_exc()
11
rstackhouse

Sie erwähnen die Verwendung einer Schleife, aber Sie verwenden eigentlich keine Schleife. Verwenden Sie eine Schleife. Auf diese Weise können Sie jede Datei einzeln in einen einzelnen try-Block schreiben. Sie haben anscheinend nichts mit den Dateien zu tun, es sei denn, Sie schreiben jeweils einen Wert. Daher müssen Sie sie nicht alle geöffnet lassen.

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)

Bearbeiten: Wenn Sie völlig unterschiedliche Dinge in die verschiedenen Dateien schreiben möchten, erstellen Sie vorab ein Wörterbuch oder eine andere Datenstruktur und speichern Sie das Mapping zwischen Dateien und Daten. Verwenden Sie das dann in der Schleife.

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)
1
BrenBarn

Beachten Sie bei der Verwendung von exc_type, value, exc_traceback = sys.exc_info(), dass der Dateiname, der die Ausnahme generiert hat, folgendermaßen abgerufen werden kann: 

exc_traceback.tb_frame.f_locals.get('filename')
1
ranaalisaeed