2013-04-08 2 views
5

은 내가보고 오늘 놀랐다 그 (파이썬 2.7.3 이상에서) 예외없이 다음 작품 :"except"에 정의되지 않은 이름이 NameError를 발생시키는 이유는 무엇입니까?

>>> try: 
...  pass 
... except ThingThatDoesNotExist: 
...  print "bad" 
... 
>>> 

나는이의 REPL에서 어떻게 유사한 NameError를 제기해야한다고 생각했을 것이다 다음과 같을 것입니다 :

>>> x = ThingThatDoesNotExist 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'ThingThatDoesNotExist' is not defined 

누구나 무슨 일이 벌어지고 있는지 알 수 있습니까?

+2

테스트는 아무 것도 시도하지 않으므로 통과합니다. 이후부터 except 절을 실행하지 않습니다. 내가 잘못 생각할 수도 있지만, 파이썬은 평가 될 때까지 정의되지 않은 변수를 무시하지 않습니까? –

+1

그건 정확히 여기서 일어나는 일입니다. 파이썬은 그 이름이 필요할 때까지 바운드되어 있는지 검사하지 않습니다. – geoffspear

+1

예. 그냥'pass'를'ValueError' 또는 뭔가를 올리는 것으로 바꾸면'NameError'가 생깁니다. – kwatford

답변

4

이이 예외를 발생시키지 않습니다 같은 이유는 :

>>> True or ThingThatDoesNotExist 

파이썬은 정확히 평가해야하는 순간을 이름을 찾습니다. 평가할 필요가없는 이름은 찾아 보지 않으며 예외를 발생시키는 실패한 조회입니다.

+0

회상 - 예, 이것은 완벽합니다. 나는이 시점에서 나는 충분한 커피로 고통 받고 있다고 생각한다. :) – dcrosta

관련 문제