Fehler bei nicht vorhandenem Obejtattribut abfangen

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
hiasl
User
Beiträge: 31
Registriert: Donnerstag 20. April 2006, 13:36

Samstag 10. Februar 2007, 10:30

Hallo,

nachdem man in Python ziemlich viel anstellen kann - gibt es eine Möglichkeit, bei einem Objekt ein nicht vorhandenes Attribut aufzurufen und den resultierenden Fehler im aufgerufenen Objekt selbst zu behandeln?

Beispiel

Code: Alles auswählen

class X(object):
    def a(self):
        pass

    def b(self):
        pass

    def fehlerHandler(self, attribut, params):
        print str(attribut) + str(params)
x = X()
x.c -> Fehler!
x.c(1,2,3) -> Fehler!

Jetzt sollte aber keine Exception von dem Interpreter geschmissen sondern fehlerHandler oder sonst eine Routine im Objekt aufgerufen werden.
Wichtig wäre es, dass der Aufrufer davon nichts mitbekommt.

Falls jemand einen Tipp oder eine Idee hat, wäre das super!

Ciao
Matthias

Edit (Leonidas): Code in Python-Tags gesetzt.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 10. Februar 2007, 11:13

hiasl hat geschrieben:Falls jemand einen Tipp oder eine Idee hat, wäre das super!
Sowas?

Code: Alles auswählen

In [1]: class X(object):
   ...:     def a(self):
   ...:         pass
   ...:
   ...:     def b(self):
   ...:         pass
   ...:
   ...:     def error_handler(self, name):
   ...:         print name
   ...:
   ...:     def __getattr__(self, name):
   ...:         self.error_handler(name)
   ...:
In [2]: x = X()
In [3]: x.c
c
c
Bitte nutze in Zukunft die Code-Tags, dann muss ich nicht manuell alle von dir eingefügten Unterstriche löschen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
hiasl
User
Beiträge: 31
Registriert: Donnerstag 20. April 2006, 13:36

Samstag 10. Februar 2007, 12:28

Hi Leonidas,

danke für den Tipp. Jetzt würde ich nur noch gerne den Aufruf an eine unbekannte Methode abfangen und umleiten. Geht das auch? In der Sprachreferenz habe ich dazu nichts gefunden...

x.c(params) -> x.handler(params)

Gruß
Matthias
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 10. Februar 2007, 12:45

Das geht auch, sogar auf dem selben Weg:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

class UnknownHandlingClass(object):
    def a(self):
        pass

    def b(self):
        pass

    def error_handler(self, *args, **kwargs):
        print "I was called with", args, "as arguments"
        print "And", kwargs, "as keyword arguments"

    def __getattr__(self, name):
        return self.error_handler

test = UnknownHandlingClass()
print test.c
test.c('haha')
My god, it's full of CARs! | Leonidasvoice vs Modvoice
hiasl
User
Beiträge: 31
Registriert: Donnerstag 20. April 2006, 13:36

Samstag 10. Februar 2007, 13:50

Vielen Dank!

letzte Frage - gibt es noch die Möglichkeit innerhalb von __getattr__ zu unterscheiden, ob "name" als Methode oder Attribut aufgerufen wurde?
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Samstag 10. Februar 2007, 13:59

Nein gibt es nicht weil es immer getattr macht und von da an weiss das Object selber nicht mehr was mit dem zurückgegebenen Attribut passiert, also ob es noch mit runden Klammern aufgerufen wird.

Beim Object wird bei beiden die __getattr__-Methode aufgerufen, darum kann man das nicht unterscheiden.

Gruss
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Montag 12. Februar 2007, 11:25

hiasl hat geschrieben:Vielen Dank!

letzte Frage - gibt es noch die Möglichkeit innerhalb von __getattr__ zu unterscheiden, ob "name" als Methode oder Attribut aufgerufen wurde?

Du kannst maximal überprüfen ob das zurückgegebene callable ist ...
Antworten