NameError
возникает при попытке оценки x
. foo
никогда не вводится, поэтому вы не можете поймать NameError
внутри foo
.
Я думаю, что вы думаете, что когда вы делаете foo(x)
, вводится foo
, а затем x
ищется. Вы хотели бы сказать: «Я не знаю, что такое x
», вместо того, чтобы позволить NameError
подняться.
К сожалению (для того, что вы хотите сделать), Python, как и почти любой другой язык программирования, оценивает свои аргументы перед их передачей в функцию. Нет способа остановить NameError
значения, переданного в foo
из внутри foo
.