e.args[0] von except Exception as e

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Mel2021
User
Beiträge: 2
Registriert: Mittwoch 5. Mai 2021, 16:40

Moin Leute,

ich durfte in meine Umschulung in Python reinschauen und man hat uns ein paar Grundlagen (versucht) zu erklären. Leider konnte der Lehrer nicht gut erklären, deshalb hab ich nun eine frage zu dem args[0] vom except.

Unser Lehrer hat es uns an folgendem Beispiel erklärt:

Code: Alles auswählen

try:
    x = int(input('Zahl: '))
except Exception as e:
    print('Falsche eingabe')
    print(e.args[0])
else:
    erg = x * x
    print('Das Quadrat von {0} ist {1}'.format(x, erg))
finally:
    print('Eingaben werden immer auf Fehler überprüft')
Leider habe ich bis jetzt nicht heraus gefunden was dieses args[0] hinter dem e in bei print soll/bewirkt/macht.
Ändere ich die Zahl auf 1 bekomme ich folgende Meldung: IndexError: tuple index out of range
Lasse ich args[0] weg, kommt die selbe Ausgabe wie bei e.args[0].
Lass ich die [0] weg, bekomme ich die Ausgabe mit Klammer, Anführungszeichen und Komma: ("invalid literal for int() with base 10: 'u'",)

Ich habe im Internet gesucht und gesucht, seit Montag schon, aber ich finde keine Verständliche Antwort.
Leider ist mein Englisch nicht so gut, aber auch die Übersetzen Texte haben mir nicht geholfen zu verstehen, was dieses args[0] bewirkt, bzw für was das gut ist.

Deshalb suche ich jetzt hier Hilfe und hoffe jemand kann es für "Dummis" erklären :D

Ich danke euch schon jetzt für eure Hilfe.

Gruß Mel
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

`args` gehört definitiv nicht zu den Grundlagen. Eigentlich braucht man das nie, falls eine Exception auswertbare Zusatzinformationen hat, sind die immer über sinnvoll benannte Attribute abrufbar.
Wenn man also den String einer Exception ausgeben möchte, reicht das `print(e)`

Nichtsdestotrotz ist es aber wichtig, zu wissen, was ein Tuple ist, und wie man damit arbeitet.

Anmerkungen zum Code: Exceptions sollten immer so präzise sein, wie möglich. Hier ist es nur sinnvoll einen ValueError abzufangen.
Variablen sollte man nicht kryptisch abkürzen: erg -> ergebnis.
In aktuellem Code würde man statt format Formatstrings verwenden.

Code: Alles auswählen

try:
    k = int(input('Zahl: '))
except ValueError as error:
    print('Falsche Eingabe')
    print(error)
else:
    ergebnis = k ** 2
    print(f'Das Quadrat von {k} ist {ergebnis}')
finally:
    print('hier würde man was aufräumen, wenn es was zum Aufräumen gäbe')
Mel2021
User
Beiträge: 2
Registriert: Mittwoch 5. Mai 2021, 16:40

Hallo Sirius3,

Danke für die Erklärung.

Gibt es eine Liste dieser "benannten Attribute"?

Ok dann werd ich mich mal mit "Tuple" beschäftigen.

Also sollte man statt "Exceptions" lieber das angeben, was den Fehler betrifft, wie du sagst hier in dem Beispiel "ValueError".
Wie wäre das dann bei Operatoren, von z.B einem Taschenrechner wo man den Nutzer den Operator (+, -, *, /) eingeben lässt, da geht doch nur Exceptions oder?

'hier würde man was aufräumen, wenn es was zum Aufräumen gäbe': Hast du ein Beispiel wo es was zum Aufräumen gibt? Den den Teil habe ich noch nicht ganz verstanden.

Gruß Mel
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Es gibt nicht die Liste an Attributen. Das hängt halt von der konkreten Exception ab, und was für Attribute eine Exception hat, steht in der Dokumentation dieser Exception.
Ein ValueError ist auch eine Exception, aber eben eine spezifischere.
Und wenn der Nutzer einen Operator eingibt, gibt es direkt überhaupt keine Exception, weil das für Python nur ein String ist. Wie und ob es in der Folge eine Exception gibt, hängt vom Code ab.
Ein `finally`-Block ist nur dann sinnvoll, wenn z.B. eine Datei oder Datenbank geschlossen werden muß, ein Internetverbindung beendet werden muß, etc.
Antworten