如何找出哪个索引超出范围?

时间:2018-09-14 12:42:15

标签: python exception index-error

如果发生IndexError,是否有办法判断行上的哪个对象“超出范围”?

考虑以下代码:

a = [1,2,3]
b = [1,2,3]

x, y = get_values_from_somewhere()

try:
   a[x] = b[y]
except IndexError as e:
   ....

如果xy太大而被IndexError捕获,我想知道ab中哪一个出局了范围内(因此我可以在except块中执行不同的操作)。

很明显,我可以分别将xylen(a)len(b)进行比较,但是我很好奇是否还有另一种使用IndexError的方法。

3 个答案:

答案 0 :(得分:4)

一种更可靠的方法是利用sys.exc_info()返回的追溯对象,从框架中提取文件名和行号指示的代码,使用ast.parse来解析该行,子类ast.NodeVisitor查找所有Subscript节点,进行未解析(使用astunparse),并使用框架的全局变量和局部变量对节点进行评估,以查看哪个节点导致异常,并打印有问题的表达式:

import sys
import linecache
import ast
import astunparse

def find_index_error():
    tb = sys.exc_info()[2]
    frame = tb.tb_frame
    lineno = tb.tb_lineno
    filename = frame.f_code.co_filename
    line = linecache.getline(filename, lineno, frame.f_globals)
    class find_index_error_node(ast.NodeVisitor):
        def visit_Subscript(self, node):
            expr = astunparse.unparse(node).strip()
            try:
                eval(expr, frame.f_globals, frame.f_locals)
            except IndexError:
                print("%s causes IndexError" % expr)
    find_index_error_node().visit(ast.parse(line.strip(), filename))

a = [1,2,3]
b = [1,2,3]
x, y = 1, 2
def f():
    return 3
try:
    a[f() - 1] = b[f() + y] + a[x + 1] # can you guess which of them causes IndexError?
except IndexError:
    find_index_error()

这将输出:

b[(f() + y)] causes IndexError

答案 1 :(得分:0)

也许是这样?

a = [1,2,3]
b = [2,3,4]
x = 5
y = 1

try:
    a[x] = b[y]
except IndexError:
    try:
        a[x]
        print('b caused indexerror')
    except IndexError:
        print('a caused indexerror')

答案 2 :(得分:-1)

否,无法使用抛出的IndexError推论两者中的哪一个超出范围。