给定mylist = [0, 1]
def catch_index_error(value):
try:
return value
except IndexError:
return None
catch_index_error(mylist[5])
返回IndexError
在执行函数之前评估参数,因此函数无法捕获异常。有没有办法抓住它?
答案 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