Try a function n times.
    
    Try to execute func(*argv, **kwarg) ``_howmany`` times. If it successfully run 
    one time, then return as normal. If it fails N times, then raise the 
    exception in the last run.
    
    **中文文档**
    
    反复尝试一个函数或方法``_howmany``次。
    
    对func函数使用try, except, pass 若干次, 期间只要有一次成功, 就正常返回。
    如果一次都没有成功, 则行为跟最后一次执行了func(*argv, **kwarg)函数一样。
    
    这个实现利用了python中可以把函数作为一个参数传入另一个函数的特质, 将func
    函数中的参数原封不动地封装到了try_ntimes的参数中。只用一个额外参数``_howmany``
    控制重复次数。

def try_ntimes(_howmany, func, *argv, **kwarg):
    """Try a function n times.
    
    Try to execute func(*argv, **kwarg) ``_howmany`` times. If it successfully run 
    one time, then return as normal. If it fails N times, then raise the 
    exception in the last run.
    
    **中文文档**
    
    反复尝试一个函数或方法``_howmany``次。
    
    对func函数使用try, except, pass 若干次, 期间只要有一次成功, 就正常返回。
    如果一次都没有成功, 则行为跟最后一次执行了func(*argv, **kwarg)函数一样。
    
    这个实现利用了python中可以把函数作为一个参数传入另一个函数的特质, 将func
    函数中的参数原封不动地封装到了try_ntimes的参数中。只用一个额外参数``_howmany``
    控制重复次数。
    """
    if (not isinstance(_howmany, int)) or (_howmany < 1):
        raise Exception("'_howmany' argument has to be int and greater than 0")
    
    counter = 1
    while counter <= _howmany:
        try:
            return func(*argv, **kwarg)
        except Exception as e:
            current_exception = e
            counter += 1
    raise current_exception