Kann eine Exception Zahlen speichern?

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
Ambriador
User
Beiträge: 35
Registriert: Freitag 25. November 2016, 01:05

Hallo an alle,
ich sitze gerade an einer Aufgabe für die Uni, in der überprüft werden soll ob sich eine Zahl in einem Intervall befindet oder nicht. Wenn die Zahl im Intervall ist soll sie ausgegeben werden, andernfalls soll ein eigener Error, "BereichsError" ausgegeben werden, und die Zahl und der Intervall gespeichert werden. Wie kann ich diese drei Zahlen denn in der Exception speichern?
Hier mein Code:

Code: Alles auswählen

class BereichsError(Exception):
    pass

def verarbeite_eingabe(a,b,c):
    if a > b and a < c:
        return a
    else:
        raise BereichsError
    
try:
    verarbeite_eingabe(101, 1, 100)
    assert(False) # Darf nicht ausgeführt werden!
except BereichsError:
    assert(True) # Muss ausgeführt werden!  
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Exceptions sind parametrisierbar:

Code: Alles auswählen

In [1]: class BereichsFehler(Exception):
   ...:     pass
   ...: 

In [2]: def is_in_range(a, b, c):
   ...:     if not a in range(b, c):
   ...:         raise BereichsFehler(a, b ,c)
   ...:     return True


In [3]: try:
   ...:     is_in_range(15, 5, 10)
   ...: except BereichsFehler as e:
   ...:     print(e)
   ...:     
(15, 5, 10)

BereichsError ist übrigens ein sehr merkwürdiger Name (auch wenn du dir den vmtl. nicht aussuchen kannst). Und ob man da eine eigene Exception für definieren muss, ist noch mal eine andere Frage. Die Funktion sollte m.M.n. auch eher Wahrheitswerte ausgeben.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Ambriador: Eine Exception ist wie jede andere Klasse auch. Jede Instanz kann beliebige Zustände speichern. Dazu sollte man aber auch eine Instanz bei raise angeben und nicht die Klasse selbst. Namen sollten eigentlich keine Mischung aus mehreren Sprachen sein. Am besten bleibst Du für ein konsistentes Bild bei Englisch. assert ist keine Funktion, die Klammern gehören da also nicht hin. Die Bedingung kann man kürzer als »b < a < c« schreiben.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@nezzcarth: »in range« macht nicht das, was man erwarten würde. Auch wenn man nur ganze Zahlen zulassen würde, die Aufgabe exklusiv gesellt ist, und Du die untere Grenze inklusive behandelst.
Ambriador
User
Beiträge: 35
Registriert: Freitag 25. November 2016, 01:05

Leider darf ich folgenden Teil des Codes nicht verändern:

Code: Alles auswählen

try:
    verarbeite_eingabe(101, 1, 100)
    assert(False) # Darf nicht ausgeführt werden!
except BereichsError:
    assert(True) # Muss ausgeführt werden!
EDIT:
Also würde das quasi reichen, damit die Exception die drei Zahlen speichert?

Code: Alles auswählen

class BereichsError(Exception):
    pass

def verarbeite_eingabe(a,b,c):
    if a > b and a < c:
        return a
    else:
        raise BereichsError(a,b,c)
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Ambriador: schöner wird es dadurch aber auch nicht.
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Sirius3 hat geschrieben:@nezzcarth: »in range« macht nicht das, was man erwarten würde. Auch wenn man nur ganze Zahlen zulassen würde, die Aufgabe exklusiv gesellt ist, und Du die untere Grenze inklusive behandelst.
Das verstehe ich nicht ganz. Dass die Obergrenze nicht enthalten ist und Floats außen vor sind, gehört doch zum erwarteten Verhalten, insb. wenn man Range im Zusammenhang mit Schleifen kennt. Würdest du vorschlagen, eher die Intervalschreibweise zu verwenden? Dass die Aufgabenstellung leicht anders ist, kann man vielleicht unter "Transferleistung" verbuchen ;) Die Kernfrage drehte sich ja um Exceptions.
Benutzeravatar
pyHoax
User
Beiträge: 84
Registriert: Donnerstag 15. Dezember 2016, 19:17

Deine Exception könnte so aussehen:

Code: Alles auswählen

class BereichstFehler(Exception):
    def __init__(self, value, minimum, maximum):
        self.value = value
        self.maximum = maximum
        self.minimum = minimum

    def __str__(self):
        return "Value '%s' ist nicht im Intervall %s[]%s" % (self.value, self.minimum, self.maximum)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ambriador hat geschrieben:

Code: Alles auswählen

def verarbeite_eingabe(a,b,c):
    if a > b and a < c:
        [...]
Unabhängig von der Sache mit der Exception könnte man die Bedingung wie folgt etwas lesbarer formulieren:

Code: Alles auswählen

def verarbeite_eingabe(a,b,c):
    if b < a < c:
        [...]
Ambriador
User
Beiträge: 35
Registriert: Freitag 25. November 2016, 01:05

@pyHoax super vielen Dank, sieht deutlich besser aus :)
Antworten