有没有办法检查哪个变量赋值方法引发了异常?例如:
a = '\xa1'
b = 'normal string'
try:
c = b.encode('ascii')
d = a.encode('ascii')
except Exception as e:
print "error thrown for input: %s" % <figure out which variable threw error>
在这种情况下,我希望输出说&#34;输入错误:d&#34;而如果我切换变量使得c = a.encode(&#39; ascii&#39;)那么输出就会说&#34;错误抛出输入:c&#34;。这是可能的还是我需要将变量赋值分成两个不同的try块?
另外,出于好奇,让我们说5个,10个或更多的变量不容易用for循环迭代。那是5-10个不同的试块吗?或者你会把它们堆成一个只用于for循环的列表吗?
答案 0 :(得分:3)
变量永远不会抛出异常。从被调用的方法 encode
抛出异常。
如果您想知道引发异常的内容,请将每个encode
调用封装在单独的try/except
块中。
您还可以查看e
:
except Exception as e:
print(e)
\xa1
的输出是:
'ascii' codec can't encode character '\xa1' in position 0: ordinal not in range(128)
在那里你看到了令人讨厌的输入。
修改强>
您还可以查看e.args
的{{1}}:
\xa1
所以('ascii', '¡', 0, 1, 'ordinal not in range(128)')
是违规输入。
答案 1 :(得分:1)
注意:请勿在家中尝试此操作,可读性计算
a = '\xa1'
b = 'normal string'
z = 0
try:
c = b.encode('ascii')
z = 1
d = a.encode('ascii')
except Exception as e:
print "error thrown for variable %s" % (a if z else b)
您可以创建一个临时变量,让我们称之为z,将其设置为0,如果b变量没有发生异常则将z更改为1,最后检查z == 1,如果是,则第二个变量中的encode方法抛出了异常,如果没有,那么第一个变量中的encode方法就是抛出异常的那个,我觉得这个代码运行良好,但是我没有测试它。
答案 2 :(得分:0)
您可以使用traceback模块获取更多信息:
a = '\xa1'
b = 'normal string'
import sys, traceback
try:
c = b.encode('ascii')
d = a.encode('ascii')
except Exception as e:
exc_type, exc_value, exc_traceback = sys.exc_info()
traceback.print_tb(exc_traceback)
File "/.............py", line 65, in <module>
d = a.encode('ascii')
traceback.print_tb(exc_traceback)
为您提供行号和违规变量。
得到理由:
print("Reason: {}".format(e.reason))
Reason: ordinal not in range(128)