Exception

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.
kostonstyle
User
Beiträge: 148
Registriert: Sonntag 2. November 2008, 12:13

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
kostonstyle
User
Beiträge: 148
Registriert: Sonntag 2. November 2008, 12:13

Muss man nicht eine Instanz bilden von DivisionByZero?
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Die Instanz wird hier erzeugt:

Code: Alles auswählen

raise DivisionByZero('Division by zero is undefined')
https://www.xing.com/go/invite/18513630.6a91d4
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

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
kostonstyle
User
Beiträge: 148
Registriert: Sonntag 2. November 2008, 12:13

Anhand von mein Beispiel ganz oben, wie benutze mein Exception?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Dein Beispiel macht ueberhaupt keinen Sinn, cofi hat dir doch gezeigt, wie's geht.

Uebrigens ist __init__ kein Konstruktor.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
kostonstyle
User
Beiträge: 148
Registriert: Sonntag 2. November 2008, 12:13

wieso ist __init__ kein konstruktor?
Braucht bei Exception gar keine Konstruktur.
Anstatt ValueError kann man auch von Exception ableiten oder?
Zuletzt geändert von kostonstyle am Freitag 7. August 2009, 11:49, insgesamt 1-mal geändert.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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.
kostonstyle
User
Beiträge: 148
Registriert: Sonntag 2. November 2008, 12:13

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)
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Code: Alles auswählen

div.division(2, 0)
Das kommt in Cofis code so nicht vor!
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

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
https://www.xing.com/go/invite/18513630.6a91d4
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.
Benutzeravatar
sebastinas
User
Beiträge: 7
Registriert: Mittwoch 7. Januar 2009, 20:29

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.
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".
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

__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...
kostonstyle
User
Beiträge: 148
Registriert: Sonntag 2. November 2008, 12:13

entschludige habe vergessen zu erwähnen, dass ich in python 3 programmiere.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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?
kostonstyle
User
Beiträge: 148
Registriert: Sonntag 2. November 2008, 12:13

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)
Antworten