Allgemeines Try: Except?

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
Purefranky
User
Beiträge: 8
Registriert: Montag 21. April 2008, 20:44

Hi Leute, fang grad an in Python, bin aber im Programmieren an sich schon erfahren.

Nur die Python-Syntax und dinge, die es in PureBasic nich gibt, sind teils neu für mich.

Zur Frage:
Wie kann ich am einfachsten einen allgemeinen Fehler abfangen, bzw. was müsste ich verändern, um folgenden Code absturzsicher zu behalten?

Code: Alles auswählen

from math import *
text=input("Geben sie eine Rechnung ein:")
while text<>"is gut nu":
    try:
        erg=eval(str(text))
    except BaseException:
        erg=str("Invalid Syntax")
    print erg
    text=input("Geben sie eine Rechnung ein:")
    
    
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo Purefranky, willkommen im Forum,

Besser so:

Code: Alles auswählen

import sys
from math import *

text = raw_input("Geben sie eine Rechnung ein:")
while text != "is gut nu":
    try:
        erg = eval(text)
    except Exception:
        erg = print >>sys.stderr, "Invalid Syntax"
    print erg
    text = raw_input("Geben sie eine Rechnung ein:")
Aber natürlich ist das nicht absturzsicher, vor allem wenn du ``eval()`` nutzt gibst du alle Sicherheiten weg.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Das mit der Print-Statement-Expression solltest du dir aber nochmal überlegen ;)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mein Vorschlag:

Code: Alles auswählen

import sys
from math import *

while True:
    text=raw_input("Geben sie eine Rechnung ein (Abbruch mit Strg-C):")
    try:
        erg=eval(str(text))
        print "Ergebniss:", erg
    except KeyboardInterrupt:
        print "ende"
        sys.exit()
    except Exception, e:
        print "Fehler:", e
Wichtig ist, raw_input statt input nehmen!
Generell ist aber eval nicht zu empfehlen, siehe: http://www.python-forum.de/topic-14044.html

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

birkenfeld hat geschrieben:Das mit der Print-Statement-Expression solltest du dir aber nochmal überlegen ;)
Ups, Code in einem Textarea zu schreiben führt nur zu Blödsinn, ich seh schon...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Nur die Python-Syntax und dinge, die es in PureBasic nich gibt, sind teils neu für mich.
Ha, ein weiterer Überläufer. Willkommen im Club!
Gruß!
BlackJack

@Purefranky: Du solltest Dir auf jeden Fall ``!=`` anstelle von ``<>`` angewöhnen, weil das in Python 3.0 raus fliegt.

Ausserdem wäre hier eine Endlosschleife (``while True:``) besser, die bei der entsprechenden Bedingung dann mit ``break`` verlassen wird. Dann spart man sich nämlich die Zuweisung an `text` mit dem gleichen Ausdruck auf der linken Seite an zwei Stellen im Programm und muss den Ausdruck nur noch einmal pflegen.

Gern gesehen werden auch Leerzeichen vor und nach binären Operatoren und Zuweisungen. Dann ist der Quelltext leichter zu lesen.
Antworten