2009-12-06 8 views
11

Betrachten Sie diese zwei Schnipsel:SyntaxError Inkonsistenz in Python?

try: 
    a+a=a 
except SyntaxError: 
    print "first exception caught" 

.

Im zweiten Fall wird die Anweisung "zweite Ausnahme .." gedruckt (Ausnahme abgefangen), während die erste nicht ist.

Ist die erste Ausnahme (nennen wir es "SyntaxError1") eine andere als die zweite ("SyntaxError2")?

Gibt es eine Möglichkeit, SyntaxError1 abzufangen (wodurch Kompilierungszeitfehler unterdrückt werden)? Wrapping große Blöcke von Code in eval ist unbefriedigend;)

+0

Fehler bei der Kompilierungszeit unterdrücken ???? Was kann das bedeuten? Können Sie eine Definition für den Anwendungsfall bereitstellen, in dem nicht analysierbarer Code analysiert werden soll? Was soll passieren? Wie schlimm kann der Code sein und dennoch "geparst" werden? Worüber redest du? –

+0

Die Frage konzentrierte sich hauptsächlich auf mögliche Inkonsistenz von SyntaxErrors, die in verschiedenen Situationen geworfen wurden. Alex erklärte, dass es überhaupt keine Inkonsistenz gibt und dass das beschriebene Verhalten in den Mechanismen des Compilers zum Aufbau einer übergeordneten Struktur von try/except besteht. Ein wahrscheinlicher Anwendungsfall könnte das Hochladen durch eine vertrauenswürdige Entwickler * .py-Datei mit einigen Funktionen (einfaches Plugin-System?) Sein, mit der Notwendigkeit, die Syntax direkt nach dem Hochladen zu validieren. – gorsky

Antwort

15

Im ersten Fall ist die Ausnahme vom Compiler angehoben wird, die vor die try/except Struktur läuft sogar existiert (da es der Compiler selbst ist, der wird gesetzt es direkt nach dem Parsen). Im zweiten Fall wird der Compiler zweimal ausgeführt - und die Exception wird ausgelöst, wenn der Compiler als Teil von eval, ausgeführt wird, nachdem der erste Lauf des Compilers den try/except bereits eingerichtet hat.

Also, Syntaxfehler abzufangen, die eine oder andere, müssen Sie veranlassen den Compiler zweimal zu laufen - eval ist eine Möglichkeit, explizite compile integrierte Funktion ruft ein anderer, import ganz praktisch ist (nach dem Schreiben Code zu einer anderen Datei), exec und execfile andere Möglichkeiten noch. Aber wie auch immer Sie es tun, Syntaxfehler können nur gefangen werden, nachdem der Compiler ein erstes Mal ausgeführt wurde, um die benötigten try/except Blöcke zu erstellen!

+0

Ich war mir der Vielfalt der Lösungen nicht bewusst. Gerade einer mit explizitem Import löst mein verstecktes Etui elegant. Vielen Dank, Alex! – gorsky

2

Kurze Antwort: Nein.

Syntaxfehler passieren, wenn der Code analysiert wird, die für die normalen Python-Code ist, bevor der Code ausgeführt wird - der Code nicht innerhalb des Try/außer Block ausgeführt wird, da der Code nicht ist Ausführen, Punkt.

Wenn Sie jedoch einen Code auswerten oder ausführen, analysieren Sie ihn zur Laufzeit, damit Sie die Ausnahme abfangen können.