Supposons que j'ai le code suivant en python 3 :

print("Hello, world!")

Cela fonctionnera certainement sans aucun problème, la sortie étant

>Hello, world!

Si je modifie mon code comme suit :

print("Hello, world!")
thisIsMyError

Le programme imprimera les éléments suivants :

>Hello, world!
>Traceback (most recent call last):
  File "main.py", line 2, in <module>
    thisIsMyError
NameError: name 'thisIsMyError' is not defined

Cela signifie que la première ligne de code est exécutée, puis la deuxième ligne n'est pas reconnue lorsqu'elle tente de l'exécuter.

Cependant, si mon code est celui-ci :

print("Hello, world!")
print("What a great day!"
thisIsMyError

La sortie est la suivante:

>File "main.py", line 3
    thisIsMyError
                ^
SyntaxError: invalid syntax

Ce qui signifie que même si la première ligne était toujours valide, elle ne fonctionnait pas du tout.

Ma question est la suivante : quelle est la différence dans la façon dont python est compilé entre ces erreurs qui, dans l'une, sont capables d'exécuter au moins la première ligne de code avec succès (Hello, world!) Même s'il y a une erreur dans les lignes suivantes mais dans la deuxième erreur, il n'exécutera pas la première ligne de code en raison d'erreurs ultérieures ?

1
Nacho321 15 mars 2019 à 08:40

2 réponses

Meilleure réponse

La raison pour laquelle vous voyez des sorties différentes avec les deux exceptions est que l'une est une exception d'exécution et l'autre est une exception d'analyse.

Avant que Python puisse exécuter votre script, il doit analyser votre code et le traduire en bytecode Python. Python analyse votre code en vérifiant qu'il a une syntaxe valide. Si Python trouve que votre script contient une syntaxe invalide, il lève un SyntaxError et s'arrête. Le point important à noter ici est qu'aucun code n'a été exécuté. Comme je l'ai dit, l'analyse syntaxique d'un script par Python se produit avant qu'il tente d'exécuter le script. C'est pourquoi dans votre deuxième exemple, la première ligne n'est pas exécutée. Python est encore au stade de l'analyse de votre script.

Dans votre premier exemple, cependant, Python a déjà analysé votre code et vérifié qu'il a une syntaxe valide. Python essaie maintenant d'exécuter votre code. L'interpréteur Python continuera à s'exécuter jusqu'à qu'il rencontre une erreur, auquel cas il s'arrête. Le point important à noter ici est que Python est en phase d'exécution lorsqu'il lève un NameError. Comme je l'ai dit plus haut, Python exécutera le code dans un script aussi longtemps qu'il le pourra. C'est pourquoi dans votre premier exemple, la première instruction est exécutée, puis l'interpréteur Python s'arrête.

Fondamentalement, SyntaxError et NameError sont deux types d'exceptions différents. SyntaxError's sont déclenchés pendant l'étape d'analyse de Python, tandis que NameError sont déclenchés pendant l'étape d'exécution de Python (c'est-à-dire l'exécution). La sortie produite par les exceptions est différente car les exceptions sont déclenchées à différentes étapes et à des fins différentes.

4
Christian Dean 15 mars 2019 à 05:55

Vous obtenez un SyntaxError à partir de votre deuxième exemple :

print("Hello, world!")
print("What a great day!"
thisIsMyError

Car il n'y a pas de crochet fermant pour l'appel de fonction print sur la deuxième ligne.

Si vous ajoutez le support, vous obtiendrez un NameError.

Comme d'autres l'ont souligné, vous obtenez le SyntaxError au moment de l'analyse car Python ne peut pas analyser le code invalide. Le NameError se produit au moment de l'exécution lorsque le code a été analysé, mais contient un nom de variable non défini.

0
snakecharmerb 16 mars 2019 à 07:19