2013-04-08 13 views
5

dzisiaj byłem zaskoczony, aby zobaczyć, że następujące prace bez wyjątków (w Pythonie 2.7.3 co najmniej):Dlaczego nieokreślona nazwa w "except" nie wywołuje NameError?

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

myślałem, że powinno to podnieść NameError w REPL, podobnie jak w następstwie:

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

Ktoś ma pojęcie, co się tutaj dzieje?

+2

Twój test niczego nie próbuje i dlatego przechodzi. Ponieważ tak jest, nigdy nie działa poza klauzulą ​​except. Mogę się mylić, ale czy Python nie ignoruje niezdefiniowanych zmiennych, dopóki nie zostaną one ocenione? –

+1

Dokładnie to się tutaj dzieje. Python nie sprawdza, czy ta nazwa jest powiązana z niczym, dopóki nie będzie potrzebna. – geoffspear

+1

Yup. Po prostu zmień 'pass' na' raise ValueError' lub coś takiego, a otrzymasz "NameError". – kwatford

Odpowiedz

4

Z tego samego powodu nie ma podnieść wyjątek:

>>> True or ThingThatDoesNotExist 

Python wyszukuje nazwy dokładnie moment, muszą być oceniane. Nazwy, które nie wymagają oceny, nie są wyszukiwane i jest to nieudane wyszukiwanie, które podnosi wyjątek.

+0

Z perspektywy czasu - tak, to ma sens. Myślę, że cierpię z powodu niewystarczającej ilości kawy w tym momencie :) – dcrosta

Powiązane problemy