Nach geraister Fehlermeldung sys.exit oder andersrum

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
Jannik192
User
Beiträge: 2
Registriert: Samstag 12. September 2009, 08:51
Wohnort: Bremen

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.
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.
Jannik192
User
Beiträge: 2
Registriert: Samstag 12. September 2009, 08:51
Wohnort: Bremen

@ allööö
Problem gelöst :)
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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`.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

``System.err.println(message)`` :?:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

sma: sys.std* hat eine write-Methode.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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:
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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')``
:?:
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Antworten