Seite 1 von 1

Nach geraister Fehlermeldung sys.exit oder andersrum

Verfasst: Samstag 12. September 2009, 08:54
von Jannik192
Moin zusammen!

Folgendes Problem

Code: Alles auswählen

if os.path.exists(sourcepath):
            pass
        else:
            raise RunlengthError("file error: input file \ninput data \
does not exist")
sys.exit(2)

        if os.path.getsize(sourcepath):
            pass
        else:
            

            raise RunlengthError("file error: input file \ninput data \
has a size of 0kb, it's an empty file")
        sys.exit(2)
Ich überprüfe in meinem Skript, ob ein Dateipfad schon vorhanden, bzw. leer ist. Wenn eins von beiden Zutrifft soll er eine Fehlermeldung, und jetzt kommt's, auch einen return code zurück geben, also sys.exit(2).

Aber nach der geraisten Fehlermeldug ist Schluss, dann wird kein return code geliefert, und wenn sys.exit zuerst steht, wird keine Fehlermeldung geraiset!

Liebe Grüße

Edit (BlackJack): Quelltext in Code-Tags gesetzt.

Verfasst: Samstag 12. September 2009, 09:15
von BlackJack
@Jannik192: Mit ``raise`` wird der Programmfluss an der Stelle abgebrochen -- Code danach wird nicht mehr ausgeführt. Das ist ja der Sinn von Ausnahmen, dass sie den Programmfluss unterbrechen.

Ein ``pass`` in ``if``- oder ``else``-Zweigen sollte man immer vermeiden und die Bedingung einfach entsprechend formulieren. Man kann Bedingungen mit ``not`` negieren.

Letztlich sollte man IMHO beide Überprüfungen nicht machen, weil zwischen der Prüfung und der tatsächlichen Verwendung der Datei genau die beiden Umstände eintreten können, die man geprüft hat, *nachdem* man geprüft hat und denkt, jetzt ist man in Sicherheit. Mit den daraus resultierenden Folgen muss man sich also sowieso herumschlagen, wenn man sauber programmieren will.

Verfasst: Samstag 12. September 2009, 09:43
von Jannik192
@ allööö
Problem gelöst :)

Verfasst: Samstag 12. September 2009, 10:49
von snafu

Code: Alles auswählen

try:
    if not os.path.getsize(path):
        RaiseEmptyFileException
        [...]
except OSError, msg:
#python 3 -> except OSError as msg
    print >> sys.stderr, msg
    #python 3 -> print(msg, file=sys.stderr)
    sys.exit(errorcode)
Bedenke aber, wie schon von BlackJack gesagt, dass das Ganze nur eine Art Momentaufnahme ist und die resultierenden Informationen nicht für spätere Zwecke verwendet werden sollten.

Verfasst: Samstag 12. September 2009, 10:54
von sma
Vielleicht so?

Code: Alles auswählen

def die(message):
    import sys
    sys.stderr.write(message)
    sys.stderr.write("\n")
    sys.exit(2)
    
die("file error: too lazy to load the file - sorry")
Stefan

Verfasst: Samstag 12. September 2009, 11:00
von snafu
@sma:

Da kann man IMHO gleich den Fehlercode als Argument mitgeben. ;)

Außerdem erhält man das \n am Ende auch durch Einsatz von `print`.

Verfasst: Samstag 12. September 2009, 11:12
von EyDu
snafu hat geschrieben:Außerdem erhält man das \n am Ende auch durch Einsatz von `print`.
sys.stderr.write

Das über print umzuleiten finde ich jetzt auch nicht wirklich schöner.

Verfasst: Samstag 12. September 2009, 11:47
von sma
Ja, man könnte die "2" zu einem Argument machen. Und ja, man könnte "print >> sys.stderr" benutzen, aber das widersprach meiner Ästhetik. Mir gefiel, das alle Zeilen mit "sys." begannen. Ein print wäre hässlich. Was ich ja eigentlich wollen würde, ist dies:

Code: Alles auswählen

sys.stderr.print(message)
sys.exit(2)
Dat kann aber selbst Python 3.x nich. <-- Doof.

Stefan

Verfasst: Samstag 12. September 2009, 16:17
von Leonidas
``System.err.println(message)`` :?:

Verfasst: Samstag 12. September 2009, 22:06
von derdon
sma: sys.std* hat eine write-Methode.

Verfasst: Samstag 12. September 2009, 23:01
von cofi
derdon hat geschrieben:sma: sys.std* hat eine write-Methode.
Die benutzt er dochauch :?:

Er hat lediglich bemaengelt, dass es keine ``print``-artige Methode gibt.
Allerdings ist man mit Python3 und

Code: Alles auswählen

print(message, file=sys.stderr)
doch da wo du hinwillst, oder verstehe ich dich da falsch sma?
Falls du deine Anapher behalten willst, musst du aber wohl ``sys.stderr`` ersetzen :twisted:

Verfasst: Samstag 12. September 2009, 23:03
von sma
derdon hat geschrieben:sma: sys.std* hat eine write-Methode.
Dann schau mal bei 11:54. Trotzdem hätte ich lieber ein `print`. Leonidas hat mich schon verstanden:

Code: Alles auswählen

from java_compat import System
System.err.println("Endlich, so muss es sein")
System.exit(2)
Nur wo bekomme ich jetzt mein `java_compat`-Modul her? :)

Stefan

Verfasst: Sonntag 13. September 2009, 20:37
von derdon
Was ist so schlimm an

Code: Alles auswählen

import sys
sys.stderr.write('%s\n' % message)
# oder ``sys.stderr.write('{0}\n'.format(message))``
# oder ``sys.stderr.write(message + '\n')``
:?:

Verfasst: Mittwoch 16. September 2009, 10:21
von sma
Es wäre schön, wenn `print()` einfach die Kurzform für `sys.stderr.print()` wäre. Warum hat man auf einmal weniger Funktion, wenn man den Ausgabekanal explizit macht?

Stefan