如何捕获索引错误

时间:2016-09-20 21:58:53

标签: python

给定mylist = [0, 1]

def catch_index_error(value):
    try:
        return value
    except IndexError:
        return None

catch_index_error(mylist[5])

返回IndexError

在执行函数之前评估参数,因此函数无法捕获异常。有没有办法抓住它?

4 个答案:

答案 0 :(得分:2)

表达式mylist[5]会导致IndexError,因为在调用函数之前会对进行求值。

解决此问题的唯一方法是让函数从mylist 返回正确的值

mylist = [0,1]
def catch_index_error(index):
  try:
     return mylist[index]
  except IndexError:
    return None

catch_index_error(0) # returns '0'
catch_index_error(4) # returns None

答案 1 :(得分:1)

try:
    catch_index_error(mylist[5])
except IndexError:
    do something

调用

中发生错误

答案 2 :(得分:1)

使用此:

try:
    mylist[5]
except IndexError:
    #your code

答案 3 :(得分:1)

这里提到的所有答案都足以满足您的要求。但我相信实现这一目标的理想方法是使用decorator。事实上,对于这种场景,它们存在于python中。例如,创建一个装饰器:

def wrap_index_error(func):
    def wrapped_func(*args, **kwargs):
        try:
            func_response = func(*args, **kwargs)
        except IndexError:
            func_response = None
        return func_response
    return wrapped_func

现在,您可以在要捕获@wrap_index_error异常的任何函数中将此装饰器用作IndexError。例如,在您的情况下:

@wrap_index_error
def get_item_from_list(my_list, index):
    return my_list[index]

现在您可以进行简单调用以访问值:

>>> new_list = [1, 3, 5]
>>> print get_item_from_list(new_list, 2)
5
>>> print get_item_from_list(new_list, 8)
None

注意:我将list作为函数的参数传递,因为更新函数内的全局值不是一个好习惯。而是将其作为参数传递。这样,您的代码将更加模块化。例如,您可能想在另一个列表上执行相同的操作吗?

要了解有关装饰器的更多信息,请查看:A guide to Python's function decorators