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.
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:
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!
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.
@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.
@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.
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.
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)