try - except problem

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
Benutzeravatar
mobby
User
Beiträge: 76
Registriert: Donnerstag 17. April 2014, 09:43

Hallo,

ich habe eine Frage zu try und except. In folgendem simplen Beispiel ist Code mit einem try und einem except Block abgebildet. Meine Entwicklungsumgebung sagt mit dabei ständig, dass die Variable y in dem except Block nicht definiert sei. Wie kann ich korrekt Variablen oder Objekte aus dem try Block im except Block aufrufen? (Ich weiß in diesem Beispiel könnte ich die Variable y auch im except Block definieren oder direkt 'finish' printen. Aber es soll als Vereinfachungen dienen. Es geht nur ums Prinzip.) Vielen Dank für Rückmeldung.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-


try:
    x = 2
    y = 'finish'
    while True:
        print x

except KeyboardInterrupt:
    print y
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@mobby: Du solltest Beispiele vorher ausprobieren, bevor Du behauptest, da würde ein Fehler auftreten. Ganz allgemein sind alle Variablen auch im except-Block verfügbar, solange sie vor dem Auftreten der Ausnahme definiert wurden, typischen Beispiel (weshalb man ja auch with benutzen sollte):

Code: Alles auswählen

try:
    input_file = open(filename)
    data = input_file.read()
except IOError:
    input_file.close()
Tritt der IO-Fehler bei "open" auf, ist input_file nicht definiert, tritt er bei "read" auf, schon.
Benutzeravatar
mobby
User
Beiträge: 76
Registriert: Donnerstag 17. April 2014, 09:43

@Sirius3: Danke für die Antwort. Der Code funktioniert. Vielleicht habe ich mich ungünstig ausgedrückt. Nur die Entwicklungsumgebung markiert mir das, daher wollte ich nur wissen, warum das auftritt und ob ich das ignorieren kann.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@mobby: nein, Du kannst das nicht ignorieren. Entweder kann die Exception bis zur Declaration der Variable nicht auftreten, dann gehört dieser Teil auch nicht in den try-Block, oder es kann doch passieren, dann mußt Du Dich damit auseinandersetzen, was passieren soll, wenn der Fehler schon so früh auftritt.
Benutzeravatar
mobby
User
Beiträge: 76
Registriert: Donnerstag 17. April 2014, 09:43

@Sirius3: Alles klar, danke für den Hinweis. Ich denke, dass ich mir das dann an meinem Code individuell anschauen muss.
BlackJack

@mobby: Sagt Dir Deine IDE denn definitiv der Name sei nicht definiert oder vielleicht das der Name *eventuell*/*möglicherweise* nicht definiert ist?
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@mobby: Ich schlage folgende Faustregeln zum Merken vor:

1. So wenig Code wie möglich in einen ``try``-Block stecken (idealerweise nur ein einzelner Funktions-/Methodenaufruf, ggf mit einer Zuweisung).

2. Sicherstellen, dass Bezeichner, die im ``except``- oder ``finally``-Block benötigt werden, *vor* Betreten des ``try``-Blocks existieren.

3. Sicherstellen, dass Bezeichner, die im weiteren Codeverlauf benötigt werden, spätestens beim Verlassen des ``try``-``except``-Blocks existieren.

Man kann sich das Leben oft leichter machen, wenn man entweder bestimmte Fehlerbehandlungen weglässt, damit die Exception hochgereicht wird und erst in einer höheren Schicht des Programms behandelt werden kann. Oder, indem man im ``except``-Block mit einem sinnvollen Rückgabewert aussteigt. Andernfalls - d.h. wenn viele Werte abhängig von vorangegangenen ``try``-``except``-Blöcken sind - wird der Code nämlich sehr schnell zu komplex und damit unleserlich und fehleranfällig.
BlackJack

Zu der Liste würde ich noch hinzufügen daran zu denken das ``try``/``except`` auch einen ``else``-Zweig kennt. Ist ja nicht in allen Programmiersprachen der Fall und das kann nützlich sein um ”Flags” und zusätzliche Prüfungen zu vermeiden wenn man Code hat der nur ausgeführt werden soll wenn *keine* Ausnahme aufgetreten ist.
Antworten