检查哪个变量抛出异常

Checking which variable threw exception

有没有办法检查哪个变量赋值方法抛出异常?例如:

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>

在这种情况下,我希望输出显示 "error thrown for input: d" 而如果我切换变量以便 c = a.encode('ascii') 那么输出将显示 "error thrown for input: c"。这是可能的还是我需要将变量赋值分成两个不同的 try 块?

另外,出于好奇,我们假设有 5 个、10 个或更多的变量不容易用 for 循环迭代。那会是 5-10 个不同的 try 块吗?或者你会把它们堆成一个列表只是为了一个 for 循环吗?

变量从不抛出异常。调用 方法 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,其中 \xa1 是:

('ascii', '¡', 0, 1, 'ordinal not in range(128)')

所以 e.args[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方法抛出异常,我认为这段代码运行良好,但我没有测试它

您可以使用 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)