繁体   English   中英

如何在try块中为条件执行相同的代码而不重复except子句中的代码

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM