[Google App Engine] - Mail versand, Exception fangen

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
bugzz
User
Beiträge: 20
Registriert: Donnerstag 17. Juni 2010, 11:38

Guten Tag, Experten!
Habe eine allgemein frage bezüglich Exceptions in Python und die Arbeit mit denen, aber da es um GAE (Google App Engine) geht, habe ich es hier gepostet.

Also, ich möchte mittels GAE mail(s) verschiecken an eine bestimmte adresse. Es gibt einen Feedback-formular. Funktionieren tut es eig. schon, aber jetzt will ich einbisschen AJAX/RPC integrieren. Die Antwort, der funktion, die die Emails verschickt, soll dann in eine Dictionary gespeicehr werden, die dann ins JSON format umgewandelt wird

Beispiel (erfolg):

Code: Alles auswählen

# Inspiration von CouchDB API
{ #Es wurde eine Instanz der Klase mail.EmailMessage erzeugt. 
  #Alles richtig. Empfaenger liste enthält ['empfaenger_1@mailforspam.com', 'empfaenger_2@mailforspam.com']
   "ok": true, 
   "recipient": [
      "empfaenger_1@mailforspam.com", 
      "empfaenger_2@mailforspam.com"
   ], 
   "sender": "absender@gae.org"
}

Beispiel (FEHLER):

Code: Alles auswählen

{ 
# Absender-Adresse ist falsch oder gar nicht eingegeben worder....
   "error": "InvalidEmailError", #exception InvalidEmailError()
   "error_str": "Empty email address for sender."
}
Beispiel (FEHLER):

Code: Alles auswählen

{ # Kein Betreff zugewiesen
   "error": "ValueError", #exception ValueError()
   "error_str": "May not set empty value for 'subject'."
}
QuellCode (testunit):

Code: Alles auswählen

class AppEngineTestCase(unittest.TestCase):
    def test_jsonmail(self):
        print 'Hello GAE pyUnit'
        email = mail.EmailMessage()
        email_dict = {
            'absender': 'None',
            'name': 'GAE Tester',
            'empfaenger': ['empfaenger_1@mailforspam.com', 'empfaenger_2@mailforspam.com'],
            'betreff': 'GAE TESTING #23',
            'text': 'FEHLER'
                }
        email.sender = email_dict.get('absender')
        email.subject = email_dict.get('betreff')
        email.to = ''
        email.body = email_dict.get('text')
        email.reply_to = email_dict.get('name') + '<' + email_dict.get('absender') + '>'
        response =  {}
        try:
            email.send()
            response['ok'] = True
            response['recipient'] = email_dict.get('empfaenger')
            response['sender'] = email_dict.get('absender')
        except Exception, e:
            #ValueError: May not set empty value for 'subject'
            #InvalidEmailError: Empty email address for to.

            response['eroor'] = type(e).__name__
            response['error_str'] = e.valie()
        finally:
            print simplejson.dumps(response, sort_keys=True, indent=3)
Wenn keine Fehler statt gefunden haben, bekomme ich mein JSON. Aber falls es eine oder andere Exceprion exestiert, gibts nichts ausser print 'Hello GAE pyUnit'. (Ich verwende eine "modifizierte version des PyUnits extra für GAE. Ausgabe nicht in der Konsole sondern in Browser")
Was mache ich falsch? Versteh ich den Sinn der Exceptions falsch? Ich mein, jedesmal wenn ich eine bekomme, script wird mit fehlermeldung unterbrochen.....

Ideen? Vorschläge ? Vielleicht ein ausführliches und verständliches Tutorial zum Thema Exceptions ? (python-docs habe ich schon gelesen....)

P.S. Hier ist die Liste aller Exceptions der Klasse EmailMessage
Deutsch ist nicht meine Muttersprache
BlackJack

@bugzz: Schau Dir mal die beiden letzten Zeilen in Deinem ``except``-Block an. Da sind zwei Tippfehler drin, einer dürfte zu einem `AttributeError` führen.
Benutzeravatar
bugzz
User
Beiträge: 20
Registriert: Donnerstag 17. Juni 2010, 11:38

Meinst du response[eroor] und e.valie()
Ja baer so gar nach der korrektur sehe ich trotzdem nichts. Ich mein, ich bekomme zwar

Code: Alles auswählen

======================================================================
ERROR: test_jsonmail (__main__.AppEngineTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/<user>/googleapps/apps/gae-mailer/main.py", line 151, in test_jsonmail
    email.to = ''
  File "/home/<user>/googleapps/google/appengine/api/mail.py", line 979, in __setattr__
    check_email_valid(value, attr)
  File "/home/<user>/googleapps/google/appengine/api/mail.py", line 167, in check_email_valid
    raise InvalidEmailError(reason)
InvalidEmailError: Empty email address for to.

----------------------------------------------------------------------
Ran 1 test in 0.014s
aber das sehe in der konsole.

Das problemm ist, es ist nicht so einfach alle mögliche Fehler aufm localhost zu testen, vor allem wenn es um Emails geht und ich kein MAIL-Server habe und vor allem wenn ICH keine python pro bin.
Ich benutze dafür smpts.py. Bekomme damit pseudo mails in terminal angezeigt, sehe aber dass das ganze project sich anders verhält als ob es online wäre. Und jedes mal hochzuladen nur um zu gucken ob exception funktioniert oder nicht ......

Ich habe mal gelesen dass die Exceptions genau dafür konzepiert worden Wenn man nicht in der lage ist alle error-case mit if und else zu bearbeiten, greift man zu exceptions.
Was ich auch noch nicht weiß, ob die gesammte Geschichte mit Exceptions doch der richtige Wahl ist. Ich mein, bei jedem Exception wird mein script gestoppt....oder versteh ich das falsch?
Deutsch ist nicht meine Muttersprache
Benutzeravatar
Klip
User
Beiträge: 98
Registriert: Donnerstag 10. August 2006, 20:39

Das Script wird nur dann gestoppt, wenn du die Ausnahme (Exception) nicht behandelst. Kümmerst du dich aber um sie, kann das Programm weiter laufen.

Code: Alles auswählen

>>> while True:
    a = int(raw_input("Zahl 1: "))
    b = int(raw_input("Zahl 2: "))
    try:
        print a / b
    except ZeroDivisionError:
        print "Durch Null teilen nicht erlaubt!"

        
Zahl 1: 12
Zahl 2: 2
6
Zahl 1: 5
Zahl 2: 1
5
Zahl 1: 3
Zahl 2: 0
Durch Null teilen nicht erlaubt!
Zahl 1: 4
Zahl 2: 2
2
Benutzeravatar
bugzz
User
Beiträge: 20
Registriert: Donnerstag 17. Juni 2010, 11:38

@ Klip, ersmal danke!
Aber wie soll ich dann in meinem fall "behandeln". Ist

Code: Alles auswählen

except Exception, e:
   response['error'] = type(e).__name__
   response['error_str'] = e.value()
keine Behandlung ?
Deutsch ist nicht meine Muttersprache
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Bis dahin kommt dein Programm gar nicht erst, weil bereits weiter oben die Zuweisung des leeren Strings an das Attribut `to` einen Fehler wirft. Die Klasse `EmailMessage` wrappt ihre Attribute, wie man an der Verwendung der Methode `__setattr__()` erkennen kann. Lies mal den Traceback genauer. ;)
BlackJack

@bugzz: Was willst Du denn dort testen? Ob Dein Code in Verbindung mit einem echten Mailserver richtig funktioniert, oder ob Dein Code auf alle möglichen Antworten eines Mailservers richtig reagiert? Im ersten Fall sind die Tests ja bis zu einem gewissen Grad vom tatsächlich eingesetzten Mailserver abhängig und testen den sogar teilweise mit. Ansonsten könnte man ja auch mit "Mock"-Objekten arbeiten um den eigenen Code zu testen.
Benutzeravatar
bugzz
User
Beiträge: 20
Registriert: Donnerstag 17. Juni 2010, 11:38

@snafu, danke für die anweisung. Hmm bin jetzt aber ideenlos wie ich dann mein wunsch mit dem JSON realisiere ?
Jede attribute-setzung für die instanz EmailMessage in try/except setzen?

Code: Alles auswählen

...
email = mail.EmailMessage()
try:
   email.to = self.reguset.get('empfaenger')
except Exception, e:
   ....
try:
   email.subject = self.request.get('betreff')
except Exception, e:
  ......
...usw...
Oder eine vernünftige Validierung machen, bei der eine "error_list" Liste erstelt wird, wo alle fehler (falls aufgetaucht) gespeichert werden. Wenn die liste leer ist => sende Mail und erstelle JSON mit SUCCESS muster (sihe oben) wenn nicht, erstelle JSON nach FAIL muster + inhalte der error_list.....

@BlackJack, an erste Stelle ob mein code funktioniert oder nicht und wenn nicht - herauszufinden worans liegt.
Deutsch ist nicht meine Muttersprache
Antworten