Декоратор, n-кратный перезапуск при исключении

def replay(cnt, sleep=0.1, log=None):
    '''
    Декоратор, n-кратный перезапуск при исключении
        *cnt = сколько раз перезапускать
        **sleep = задержка между перезапусками, линейно растёт с перезапусками
        **log = функция для логгинга трейсбэков (например logging.debug)
    '''
    def decorator(func):
        def wrapper(*args, **kwargs):
            for i in xrange(replay_cnt):
                if i:
                    s = sleep * i
                    if log:
                        log('--- REPLAY %i (%s), sleep %0.2f sec.' % (i, func.__name__, s))
                    time.sleep(s)
                try:
                    return func(*args, **kwargs)
                except (KeyboardInterrupt, SystemExit):
                    raise                    
                except Exception, e:
                    pass
            raise
        return wrapper
    return decorator