[Django] Eigenen Fehler zurückgeben

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
normic
User
Beiträge: 12
Registriert: Mittwoch 8. Juli 2009, 17:28
Kontaktdaten:

Hallo zusammen,
ich steh' hier grad auf'm Schlauch.

Ich rufe aus'm Admin beim speichern von Daten einen XML-Service auf. Wenn dieser nicht erreichbar ist, will ich dem User eine Meldung präsentieren und das Form nicht speichern.

Hier mein Codeversuch:

Code: Alles auswählen

class SpoofServiceAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        if change:
            pass
        else:
            try:
                    import xmlrpclib
                    # connect to xml-service
                    rc = xmlrpclib.ServerProxy("http://127.0.0.1:1337")
                    # call the function with given params
                    rc.Servicecall(obj.callback, obj.target_no)
            except Exception, e:
                if e[0] == 111:
                    raise forms.ValidationError("(%s) No connect to server...please try again later" % e)
                
            obj.save()
Ich bekomme allerdings statt des Fehlers die DEBUG-Seite angezeigt!?

Ich glaub ich mach hier grad einen bösen Denkfehler - komme aber nicht drauf...

Gruß,
Michael
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

a) auf Exception zu catchen ist schon mal sehr böse, und b) speicherst du scheinbar nur bei change, das ist auch kontraproduktiv und c) willst du die fehlermeldung der debug page posten.
normic
User
Beiträge: 12
Registriert: Mittwoch 8. Juli 2009, 17:28
Kontaktdaten:

Erstmal danke für die Antwort.

a) leuchtet mir jetzt nicht ein, ich bekomme halt nur einen Fehler zurück wenn der Dienst nicht erreichbar ist

b) ich habe lediglich mit add angefangen, bei change kommt später noch anderer Code hinzu

c) Da habe ich mich wohl ein wenig unklar ausgedrückt. Ich bekomme schon die geschriebene Fehlermeldung, aber eben auf der Debugpage.
Nach meinem Verständnis müsste doch ein Validationerror lediglich eine Textzeile mit der Meldung erzeugen? Wie wenn ich ein Feld falsch ausgefüllt habe...

Trotzdem anbei die Meldung:
ValidationError at /admin/phonetools/myservice/add/
[u"((111, 'Connection refused')) No connect to server...please try again later"]
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Du willst nicht ''exception Exception"" sondern eher was wie "except ConnectionError", was die Funktion halt schmeißt, ich glaube kaum, dass die ne normale Exception schmeißt. Außerdem wie kommst du auf die Idee, dass du in save_model einen ValidationError schmeißen könntest? zu save_model kommt du nur wenn das Form valid ist, und in dieser Funktion darfst du wirklich nur das Model speichern und keinen einizgen Error raisen.
normic
User
Beiträge: 12
Registriert: Mittwoch 8. Juli 2009, 17:28
Kontaktdaten:

Hallo apollo13,
danke für Deine Ausführungen.

Das mit der Exception leuchtet mir nun ein, allerdings bekomme ich lediglich diesen Error (mit code 111) wenn der Dienst gar nicht erreichbar ist, da gibt's natürlich keine spezielle Exception.
Auf der Debugpage ist der lediglich mit Error benannt.
Naja und genau den Fall wollte ich möglichst transparent für den User abfangen.
zu save_model kommt du nur wenn das Form valid ist
Autsch, stimmt da hätte ich auch drauf kommen können...

Also muss ich den Fehler vorher schon abfangen und nicht erst in save_model.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

So weit ich das sehe ist der Error eine socket.error Exception, die du sehr wohl explizit abfangen kannst; http://docs.python.org/library/socket.html#socket.error
Antworten