2016-06-07 9 views
0

Ich entwickle einen asynchronen Webdienst mit Twisted Klein. Ein Teil des Codes ist wie folgt:Wie vermeidet man den Befehl yield in Python, löst jedes Mal Exceptions aus?

@inlineCallbacks 
def test(input1): 
    try: 
     result = yield function(input1) 
     print result 
     returnValue(result) 
    except: 
     returnValue("None") 
     pass 

Ich habe diese test Funktion als Teil meines Web-Service, genannt jedesmal, wenn ich die test von einer anderen Funktion in returns „None“. Auf dem Serverbildschirm wird jedoch das richtige Ergebnis gedruckt (die Zeile print result in try wird korrekt ausgeführt, nur die returnValue(result) wird nicht verwendet). Ich bin mit asynchronen Codierungen nicht sehr vertraut, aber sollte ich etwas vorsichtiges ausprobieren, außer mit der Ausbeute? Vielen Dank.

+3

zurückzukehren Warum sind Sie mit einem nackten 'except' mit? Sie sollten den spezifischen Ausnahmetyp abfangen, den Sie erwarten. Ich weiß nicht viel über Twisted Klein, aber eine schnelle Google-Suche sagt, dass sie [Ausnahmen verwenden, um Coroutinen zu simulieren] (http://tavendo.com/blog/post/going-asynchronous-from-flask-to-twisted) -klein /), so würde ein blankes 'außer' mit dem ziemlich hart schrauben. – user2357112

+0

Also ändere ich dies aus einem Flaschencode, und ich rufe eine API auf, die die Ausnahme zurückwerfen könnte, ich will nicht, dass sie abstürzt, also benutze ich try/except, um das zu tun. Vielleicht sollte ich das bloß entfernen und sehen, wie es funktioniert? – JLTChiu

+0

Es funktionierte tatsächlich, nachdem ich das bloße ausgenommen entfernte. Ich denke, ich muss dann alle möglichen Ausnahmen von der API angeben. Ich möchte Sie als die richtige Antwort bezeichnen, aber Sie sind in einem Kommentar – JLTChiu

Antwort

2

Zuerst sollten Sie nie eine bare except Klausel haben. (Es gibt Ausnahmen, aber im Allgemeinen ist es besser, bestimmte Fehler zu fangen.)

Zweitens von dem verdrehten docs auf return:

Hinweis: Dies ist derzeit implementiert durch eine Ausnahme von BaseException abgeleitet erhöhen. Möglicherweise möchten Sie alle 'exception:' - Klauseln in eine 'except Exception:' - Klausel ändern, um diese Ausnahme nicht zu erfassen.

Auch: Während diese Funktion derzeit funktioniert, wenn sie innerhalb von beliebigen Funktionen aufgerufen wird, die innerhalb des Generators aufgerufen werden, verlassen Sie sich nicht auf dieses Verhalten.

Was geschieht, ist Ihre richtige Ergebnis druckt, Sie dann returnValue nennen, die eine Ausnahme auslöst, Ihren Code verursacht None

twisted docs