[英]How can I execute same code for a condition in try block without repeating code in except clause
我正在检查列表的连续索引,如果连续元素不相等或者列表索引超出范围,我想执行相同的代码。 这就是我正在尝试的
for n in range(len(myList))
try:
if myList[n]==myList[n+1]:
#some code
else:
#if they are not equal then do something
#same code should execute if exception raised: index error --> how do i do this?
有没有办法优雅地做到这一点,而不必以某种方式在except块中重复相同的代码?
执行此操作的一种简单方法是仅修改if语句以检查候选元素是否不是最后一个,从而避免需要异常子句,并保持代码简短。
for n, i in enumerate(myList):
if n+1 != len(myList) and i == myList[n+1]:
#some code
else:
#if they are not equal then do something
#This block will also be exicuted when last element is reached
for n in range(1, len(myList))
if myList[n]==myList[n-1]:
#some code
else:
#foo_bar()
#foo_bar()
看看这个(汤姆罗恩建议):
def foobar():
#the code you want to execute in both case
for n in range(len(myList)):
try:
if myList[n]==myList[n+1]:
#some code
else:
foobar()
except IndexError:
foobar()
其他答案适用于您可以避免首先提出异常的特定情况。 无法避免异常的更一般情况可以处理lambda函数,如下所示:
def test(expression, exception_list, on_exception):
try:
return expression()
except exception_list:
return on_exception
if test(lambda: some_function(data), SomeException, None) is None:
report_error('Something happened')
这里的关键点是使它成为一个lambda推迟对可能引发异常的表达式的评估,直到test()
函数的try / except块中可以捕获它。 test()
返回评估结果,或者,如果引发exception_list中的exception_list
,则on_exception
值。
这来自被拒绝的PEP 463中的一个想法。 lambda to the Rescue提出了同样的想法。
(我在回答这个问题时给出了相同的答案,但我在这里重复一遍,因为这不是一个重复的问题。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.