2017-07-19 2 views
0

Je suis nouveau à python et j'ai eu aucune difficulté avec un exemple d'apprentissage essayer et à l'exception des blocs:python - capture chaîne inachevée Erreur de syntaxe à l'aide essayer sauf

try: 
    2 + "s" 
except TypeError: 
    print "There was a type error!" 

qui produit ce que l'on pouvait s'y attendre:

There was a type error! 

Cependant, en essayant d'attraper une erreur de syntaxe comme ceci:

try: 
    print 'Hello 
except SyntaxError: 
    print "There was a syntax error!" 
finally: 
    print "Finally, this was printed" 

J'ir obtenir l'erreur de syntaxe EOL. J'essayais cela quelques fois dans l'environnement de cahier jupyter et seulement quand je suis passé à un terminal dans VIM il me semblait logique que le compilateur interprétait les blocs de code except et finalement comme le reste de la chaîne incomplète.

Ma question est de savoir comment aborder la gestion des erreurs de syntaxe dans ce format? Ou y a-t-il une manière plus efficace (pythonique?) De s'y prendre?

Ce n'est peut-être pas quelque chose que l'on trouve vraiment mais il serait intéressant de savoir s'il y avait une solution de contournement propre.

Merci!

+0

manquant une citation de fermeture après la ligne : imprimer 'Bonjour –

+6

Vous ne pouvez pas; De telles erreurs de syntaxe sont déclenchées lors de l'analyse, pas lors de l'exécution. L'analyseur ne voit même pas qu'il existe une instruction 'except', car elle fait toujours partie de la chaîne qu'il analyse. Vous obtenez l'erreur EOL car une chaîne entre guillemets non-triple doit être fermée avant la fin de la ligne en cours. – chepner

+2

Les seules 'SyntaxError' capturables sont celles qui proviennent d'une instruction' exec' syntaxiquement valide dont * argument * contient des erreurs de syntaxe. – chepner

Répondre

0

La raison pour laquelle vous ne pouvez pas utiliser un bloc try/except pour capturer SyntaxErrors est que ces erreurs se produisent avant l'exécution de votre code.

étapes de haut niveau du code Python exécution

  1. interpréteur traduit le code python python en instructions exécutables. (Erreur de syntaxe surélevée)
  2. Les instructions sont exécutées. (Try/except exécuté)

Depuis l'erreur se produit lors de l'étape 1, vous ne pouvez pas utiliser un essai/sauf pour les intercepter, car il n'est exécutée à l'étape 2.

-1

La réponse est facile gâteau:

Le SyntaxError annule la déclaration except et finally parce qu'ils sont à l'intérieur d'une chaîne.

+0

Non, ils ne sont pas dans la chaîne. – chepner

+1

Les littéraux de chaînes de guillemets simples se terminent à la fin de la ligne ... donc ils ne font pas partie de la chaîne littérale. La réponse est parce que ceci est jeté par l'analyseur pas l'exécution. Vous ne pouvez attraper que des exceptions d'exécution. – AChampion

+0

Droite. Désolé, je n'ai pas vraiment compris le contexte. –