在以下函数中,是什么让try:
提前退出?如果我将相同的代码放在def
块之外,它可以正常工作。
tiles = ['095D', '094M']
in_file = 'in_file'
out_file = 'out_file'
expression = ''' "FIELDNAME" LIKE 'STUFF' '''
def foobar(in_file, out_file, expression):
print in_file, out_file, expression
try:
print 'this is trying'
#pretty print tile list, from http://stackoverflow.com/questions/2399112/python-print-delimited-list
tiles = ','.join(map(str,tiles))
print 'made it past tiles!'
print 'From %s \nselecting %s \ninto %s' % (in_file, tiles, out_file)
except:
print 'Made it to the except block!'
foobar(in_file, out_file, expression)
结果:
D:\> python xx-debug.py
in_file out_file "FIELDNAME" LIKE 'STUFF'
this is trying
Made it to the except block!
this is trying
made it past tiles!
From in_file
selecting 095D,094M
into out_file
答案 0 :(得分:3)
它无效的原因是因为您在全局范围内定义了tiles
。在您分配给tiles
的功能中。这使tiles
成为函数中的本地范围名称。反过来,这意味着函数中的代码根本不会在全局范围内查找tiles
。
在分配中,您正在尝试获取 tiles
(这是在本地分配之前。)这会导致异常被引发,因为您尝试访问未分配的局部变量。
快速解决方法是使用global
:
...
def foobar(in_file, out_file, expression):
global tiles
...
正如其他人所说,不要只是在不做任何事情的情况下捕捉异常。在调试代码时,您想要抛出异常,以便找到并修复原因!删除try
... except
,或让except
获取例外并打印有关它的有用信息,如下所示:
try:
...
except Exception, e:
print 'Oh noes!', e
这可能需要阅读很多,但如果你阅读它,你会更好地理解Python:
http://docs.python.org/reference/executionmodel.html
它解释了Python如何处理模块范围和函数范围等中的变量定义。它还包括异常。
答案 1 :(得分:3)
异常输出:
Traceback (most recent call last):
File "sof.py", line 19, in <module>
foobar(in_file, out_file, expression)
File "sof.py", line 11, in foobar
tiles = ','.join(map(str,tiles))
UnboundLocalError: local variable 'tiles' referenced before assignment
现在,这是因为tile实际上是在全局空间中定义的。所以,你的函数应该是这样的:
def foobar(in_file, out_file, expression):
global tiles
...
答案 2 :(得分:-1)
这是一个有趣的错误。所以函数外部有一个模块范围的tiles
,因为你没有使用global
,所以你在函数内部创建了一个新的tiles
变量。这可以。或者它会很好,除了它出现(当我在交互式Python中乱七八糟)语句的左值(左边的tiles
)是本地的时候,使整个语句认为对tile的任何引用都意味着当地人。因此,在该map构造中,不使用模块tites
,而是使用本地模块,除了本地模块尚不存在。
这可能是Python中的一个错误,但可能是预期的。