Python 出乎意料的 "except" 加薪

Unexpectable "except" raise in Python

请帮助 python 脚本。 Python 2.7。 我试图制作一些功能来通过错误检查重复操作。 所以在我认为下面调用的函数中(lib_func),没有错误。 但是 repeater() 中的 "except" 以任何方式提升。

如果我不在 lib_func() 中使用 "x" - 它可以正常工作,但我仍然需要在 lib_func() 中输入参数。

抱歉英语不好,在此先感谢您的帮助。

def error_handler():
    print ('error!!!!!!')

def lib_func(x):
    print ('lib_func here! and x = ' + str(x))

def repeater(some_function):
    for attempts in range(0, 2):
        try:
            some_function()
        except:
            if attempts == 1:
                error_handler()
            else:
                continue
    break
return some_function

repeater(lib_func(10))

输出:

lib_func here! and x = 10
error!!!!!!

Process finished with exit code 0

你应该传递函数指针而不是像你在这里那样调用它

repeater(lib_func(10))

应该是

repeater(lib_func)

您可以修改它以将数字作为参数

repeater(lib_func, 10)

你的函数应该是

def repeater(some_function, some_value):
    for attempts in range(0, 2):
        try:
            some_function(some_value)
        except:
            if attempts == 1:
                error_handler()
            else:
                continue
        #the break statement makes no sense 
    return #why would you return the function as it is not doing anything!

你的缩进有误,转发器应该这样调用:

def repeater(some_function):
    for attempts in range(0, 2):
        try:
            some_function()
        except:
            if attempts == 1:
                error_handler()
            else:
                continue
    return some_function()

repeater(lambda: lib_func(10)) # pass `lib_func(10)` using lambda

我不明白你想要实现什么,但是上面的代码在一个for循环中执行了几次lib_func(10)

或者,您可以使用部分:

from functools import partial    
lf = partial(lib_func, 10)    
repeater(lf)

你遇到了变量与函数的问题。

repeater 期望以 函数 作为参数调用。所以当你调用 repeater(lib_func) 时,一切都很好:some_function() 实际上调用了 lib_func().

但是当您尝试调用 repeater(lib_func(10)) 时,python 首先计算 lib_func(10))(在上面的代码中返回 None)然后调用 repeater(None) =>给出异常,因为 None 不可调用 !

如果您希望能够使用一个参数调用转发器,您应该将参数传递给 repeater。例如:

def repeater(some_function, arg = None):
    for attempts in range(0, 2):
        try:
            cr = some_function() if arg is None else some_function(arg)
        except:
            if attempts == 1:
                error_handler()
            else:
                continue
        break
    return cr

repeater(lib_func, 10)

或者如果你想接受可变数量的参数:

def repeater(some_function, *args):
    for attempts in range(0, 2):
        try:
            cr = some_function(*args)
        except:
            if attempts == 1:
                error_handler()
            else:
                continue
        break
    return cr

repeater(lib_func, 10)