Python 如何捕捉索引错误

Python 如何捕捉索引错误,python,Python,给定mylist=[0,1] def catch_index_error(value): try: return value except IndexError: return None catch_index_error(mylist[5]) 返回一个索引器 在执行函数之前对参数求值,因此函数无法捕获异常。有办法抓住它吗 try: catch_index_error(mylist[5]) except IndexError:

给定
mylist=[0,1]

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

catch_index_error(mylist[5])
返回一个
索引器

在执行函数之前对参数求值,因此函数无法捕获异常。有办法抓住它吗

try:
    catch_index_error(mylist[5])
except IndexError:
    do something
错误发生在调用中使用以下命令:

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

表达式
mylist[5]
导致
索引器
,因为它是在调用函数之前计算的

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


这里提到的所有答案都能满足您的要求。但我相信实现这一点的理想方法是使用
装饰器。事实上,它们存在于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\u index\u error
。例如,在您的案例中:

@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作为参数传递给函数,因为在函数中更新全局值不是一个好的做法。而是将其作为一个参数传递。这样,您的代码将更加模块化。例如,您是否希望在另一个列表上执行相同的操作


要了解更多关于装饰师的信息,请查看:

谢谢。这是有效的,这正是我一直在寻找的。添加了一个使用decorator的答案。我相信你会有兴趣去看看
>>> new_list = [1, 3, 5]
>>> print get_item_from_list(new_list, 2)
5
>>> print get_item_from_list(new_list, 8)
None