Seite 1 von 2
Exception
Verfasst: Donnerstag 6. August 2009, 21:20
von kostonstyle
Hallo
habe eine Frage, wie kann ich hier den Exception benutzen?
Code: Alles auswählen
class DivisionByNull(Exception):
#Konstruktur
def __init__(self, z):
self.zaehler = z
def division(self, z, n):
if n == 0:
raise DivisionByNull(z)
else:
return z / n
#Main
try:
division(12, 0)
except DivisionByNull as e:
print("Nulldivision")
Danke kostonstyle
Verfasst: Donnerstag 6. August 2009, 21:28
von cofi
Ich glaube du hast das Exception Konzept nicht verstanden.
Code: Alles auswählen
class DivisionByZero(ValueError):
pass
def division(dividend, divisor):
if divisor == 0:
raise DivisionByZero('Division by zero is undefined')
else:
return dividend / divisor
try:
print division(2, 3)
print division(2, 0)
except DivisionByZero as e:
print e
Lies am besten mal die entsprechenden Kapitel im Tutorial.
Verfasst: Freitag 7. August 2009, 11:05
von kostonstyle
Muss man nicht eine Instanz bilden von DivisionByZero?
Verfasst: Freitag 7. August 2009, 11:08
von lutz.horn
Die Instanz wird hier erzeugt:
Verfasst: Freitag 7. August 2009, 11:15
von HerrHagen
Das Bilden einer Instanz für ein Exception-Objekt funktioniert wie bei jeden anderen Objekt auch. Ausgelöst wird die Exception dann mit raise:
Code: Alles auswählen
>>> class DivisionByZero(ValueError):
pass
>>> ex = DivisionByZero("Text")
>>> ex
DivisionByZero('Text',)
>>> ex.message
'Text'
>>> raise ex
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
raise ex
DivisionByZero: Text
Verfasst: Freitag 7. August 2009, 11:38
von kostonstyle
Anhand von mein Beispiel ganz oben, wie benutze mein Exception?
Verfasst: Freitag 7. August 2009, 11:42
von Rebecca
Dein Beispiel macht ueberhaupt keinen Sinn, cofi hat dir doch gezeigt, wie's geht.
Uebrigens ist __init__ kein Konstruktor.
Verfasst: Freitag 7. August 2009, 11:45
von kostonstyle
wieso ist __init__ kein konstruktor?
Braucht bei Exception gar keine Konstruktur.
Anstatt ValueError kann man auch von Exception ableiten oder?
Verfasst: Freitag 7. August 2009, 11:45
von Zap
kostonstyle hat geschrieben:Anhand von mein Beispiel ganz oben, wie benutze mein Exception?
Dein Beispiel ganz oben sollte man garnicht verwenden.
Richte dich lieber nach dem Vorschlag von cofi.
Verfasst: Freitag 7. August 2009, 11:51
von kostonstyle
Ok, aber warum ist __init__ kein konstruktur, dass möchte ich noch gerne wissen.
Ich habe diese Beispiele aus dem Buch python 3 von galileo.
wenn ich den beispiel von cofi ausführe, erhalte ich die Fehlermeldung
Code: Alles auswählen
Traceback (most recent call last):
File "/Volumes/Develop/pyexer/src/exercise.py", line 12, in <module>
print(div.division(2, 0))
TypeError: division() takes exactly 2 positional arguments (3 given)
Verfasst: Freitag 7. August 2009, 11:54
von Rebecca
Der Konstruktor ist __new__, __init__ wird erst aufgerufen, nachdem das Objekt schon erzeugt wurde, korrekterweise ist es also eher ein Initialisator. Du hast ihn schon voellig korrekt verwendet, mir ging es eher um deinen Kommentar im Quellcode.
Verfasst: Freitag 7. August 2009, 11:58
von Rebecca
Das kommt in Cofis code so nicht vor!
Verfasst: Freitag 7. August 2009, 11:58
von lutz.horn
kostonstyle hat geschrieben:Ok, aber warum ist __init__ kein konstruktur, dass möchte ich noch gerne wissen.
http://docs.python.org/tutorial/classes ... ss-objects
The instantiation operation (“calling” a class object) creates an empty object.
kostonstyle hat geschrieben:wenn ich den beispiel von cofi ausführe, erhalte ich die Fehlermeldung
Dann hast Du das Beispiel nicht richtig abgeschrieben. Es liefert dies:
Code: Alles auswählen
python ex.py
Text
ex.py:6: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
print ex.message
Text
Traceback (most recent call last):
File "ex.py", line 7, in <module>
raise ex
__main__.DivisionByZero: Text
Verfasst: Freitag 7. August 2009, 12:06
von BlackJack
@kostonstyle: Ich würde mal sagen das Buch taugt nichts. Obwohl ich mir auch gut vorstellen kann, dass Du auch dort falsch abgeschrieben hast.
Verfasst: Freitag 7. August 2009, 13:52
von sebastinas
Rebecca hat geschrieben:Der Konstruktor ist __new__, __init__ wird erst aufgerufen, nachdem das Objekt schon erzeugt wurde, korrekterweise ist es also eher ein Initialisator. Du hast ihn schon voellig korrekt verwendet, mir ging es eher um deinen Kommentar im Quellcode.
Also entweder verwendest du einen anderen
Constructor-Begriff, oder du bist etwas falsch an. Das steht in der Doku bei
__init__: "As a special constraint on constructors, ..." Somit ist
__init__ am ehesten als Constructor zu bezeichnen.
Und sollte man C++-ischsmen verwenden, ist
__new__ am ehesten ein Allocator, und
__init__ definitiv der Constructor. Das könnte man aber auch daraus folgern, dass
__init__ eine fertige Instanz bekommt. Und das wird in allen OO-Sprachen - die mir gerade in den Sinn kommen zumindest - auch so gehandhabt. Dein
Constructor-Begriff scheint also von der gängigen Variante verschieden zu sein.
Verfasst: Freitag 7. August 2009, 14:39
von BlackJack
@sebastinas: Solange die Sprache nicht so etwas wie `__new__()` kennt, ist im Äquivalent zu `__init__()` ja auch das erstellen des Objektes inbegriffen. Und dann benutzen halt viele den Begriff falsch wodurch er richtig erscheint. Ich denke mal das ist so ähnlich wie bei "Instanz".
Verfasst: Freitag 7. August 2009, 16:05
von DasIch
__new__ erstellt eine Instanz und gibt diese zurück; __init__ modifiziert diese. Damit ist ziemlich klar dass die Konstruktion in __new__ statt findet. Wobei man natürlich argumentieren könnte dass die Konstruktion in der Klasse selbst statt findet und damit in type.__call__ bzw. class.__metaclass__.__call__, allerdings geben die letztendlich nur die Klasse zurück...
Verfasst: Freitag 7. August 2009, 20:34
von kostonstyle
entschludige habe vergessen zu erwähnen, dass ich in python 3 programmiere.
Verfasst: Freitag 7. August 2009, 20:41
von cofi
Und was soll das jetzt erklaeren?
Das Einzige, dass meinen Code nicht zu 3.x kompatible macht, sind die ``print`` Statements. Allerdings sagt deine Fehlermeldung, dass du bei der Anwendung Scheisse baust.
Was soll das ``div`` sein? Wo kommt das her? Jetzt sag nicht, dass du das in eine Klasse verpackt hast, ohne den Code zu aendern?
Verfasst: Freitag 7. August 2009, 20:51
von kostonstyle
also das beispiel aus dem buch sieht so aus
Code: Alles auswählen
class DivisionByZeroError(Exception):
def __init__(self, z):
self.Zaehler = z
def division(z, n):
if n == 0:
raise DivisionByZeroError(z)
else:
return z / n
try:
division(12, 0)
except DivisionByZeroError as e:
print("Nulldivision: {0} / 0".format(e.Zaehler))
trotzdem bekomme ich die Fehlermeldung
Code: Alles auswählen
Traceback (most recent call last):
File "/Volumes/Develop/pyexer/src/exercise.py", line 13, in <module>
div = DivisionByZeroError()
TypeError: __init__() takes exactly 2 positional arguments (1 given)