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

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