检查哪个变量引发了异常

时间:2015-02-09 15:44:14

标签: python python-2.7 exception-handling

有没有办法检查哪个变量赋值方法引发了异常?例如:

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循环的列表吗?

3 个答案:

答案 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)