Как я могу повторить попытку, если у меня было, кроме? - PullRequest
4 голосов
/ 14 апреля 2020

Я кодирую записку, которая использует gspread для чтения и записи в Google Sheets.

В части «записи» кода мне пришлось добавить try-except из-за вызванной APIError по пределу квоты записи, поэтому, когда выполняется исключение, нужно подождать 100 секунд, а затем продолжить. Проблема в том, что он игнорирует элемент, вызвавший исключение, но должен был повторить этот элемент

    def process_cpf_list(self):

        # SKIP OVER COLUMN HEADING IN THE SPREADSHEET
        cpfs = self.sheet.col_values(self.cpf_col)[1:]
        bot_url = BOT()

        for row, cpf in enumerate(cpfs):
            nome, idade, beneficio, concessao, salario, bancos, bancocard, consig, card = bot_url.search_cpfs(cpf)

            # UPDATE THE SHEET
            print("Atualizando...")
            try:
                row = row + 2
                self.sheet.update_cell(row, self.nome_col, nome)
                self.sheet.update_cell(row, self.age_col, idade)
                self.sheet.update_cell(row, self.beneficio_col, beneficio)
                self.sheet.update_cell(row, self.concessao_col, concessao)
                self.sheet.update_cell(row, self.salario_col, salario)
                self.sheet.update_cell(row, self.bancos_col, bancos)
                self.sheet.update_cell(row, self.bancocard_col, bancocard)
                self.sheet.update_cell(row, self.consig_col, consig)
                self.sheet.update_cell(row, self.card_col, card)
                print('Cliente atualizado!')
            except APIError:
                print('Esperando para atualizar...')
                time.sleep(100)
                continue


cpf_updater = CpfSearch('TESTE')
cpf_updater.process_cpf_list()

Ответы [ 5 ]

3 голосов
/ 14 апреля 2020
while True:
    try:
        # do some stuff
        break # we didn't hit the exception, exit the loop
    except APIError:
        # handle the exception...
2 голосов
/ 14 апреля 2020

Это не должно повторять пункт в этом случае. Когда вы выполняете итерацию для l oop, как только предмет выбран, он не будет выбран снова.

Вы можете добавить время l oop, которое будет бесконечно пытаться выполнить обновление, если обновление не выполнено:

for row, cpf in enumerate(cpfs):
    nome, idade, beneficio, concessao, salario, bancos, bancocard, consig, card = bot_url.search_cpfs(cpf)

    # UPDATE THE SHEET
    print("Atualizando...")
    max_retries = 3
    row = row + 2
    while max_retries:
        try:
            self.sheet.update_cell(row, self.nome_col, nome)
            self.sheet.update_cell(row, self.age_col, idade)
            self.sheet.update_cell(row, self.beneficio_col, beneficio)
            self.sheet.update_cell(row, self.concessao_col, concessao)
            self.sheet.update_cell(row, self.salario_col, salario)
            self.sheet.update_cell(row, self.bancos_col, bancos)
            self.sheet.update_cell(row, self.bancocard_col, bancocard)
            self.sheet.update_cell(row, self.consig_col, consig)
            self.sheet.update_cell(row, self.card_col, card)
            print('Cliente atualizado!')
            break
        except APIError:
            max_retries -= 1
            print('Esperando para atualizar...')
            time.sleep(100)

РЕДАКТИРОВАТЬ:

Я добавил простой механизм повторных попыток , который попытается 3 раза, прежде чем пропустить строку.

0 голосов
/ 14 апреля 2020

Другой вариант - использовать библиотеку retring , которая обрабатывает повторные попытки для вас на уровне метода.

Преимуществом здесь является получение доступа ко многим проверенным функциям, таким как экспоненциальные откаты / повторные попытки только N раз и c ... без необходимости писать это самостоятельно.
Недостатком является то, что вы добавляем новую зависимость, если вы находитесь в ситуации, когда это имеет значение. И это может быть больше, чем вам нужно - в этом случае использовать блок while и просто повторять навсегда гораздо проще.

Например, вы бы переместили свою логику c, которая ненадежна, в отдельный метод, и обернули ее в аннотацию @retry следующим образом:

from retrying import retry

def process_cpf_list(self):

    ...

    for row, cpf in enumerate(cpfs):
        update_cells(...)


@retry(wait_fixed=100000)  # Retry after 100 seconds
def update_cells(...):
  self.sheet.update_cell(row, self.nome_col, nome) 
  etc...


cpf_updater = CpfSearch('TESTE')
cpf_updater.process_cpf_list()
0 голосов
/ 14 апреля 2020

почему бы вам просто не использовать while -l oop?

for row, cpf in enumerate(cpfs):
    nome, idade, beneficio, concessao, salario, bancos, bancocard, consig, card = bot_url.search_cpfs(cpf)

    # UPDATE THE SHEET
    print("Atualizando...")
    while True:
        try:
            row = row + 2
            self.sheet.update_cell(row, self.nome_col, nome)
            self.sheet.update_cell(row, self.age_col, idade)
            self.sheet.update_cell(row, self.beneficio_col, beneficio)
            self.sheet.update_cell(row, self.concessao_col, concessao)
            self.sheet.update_cell(row, self.salario_col, salario)
            self.sheet.update_cell(row, self.bancos_col, bancos)
            self.sheet.update_cell(row, self.bancocard_col, bancocard)
            self.sheet.update_cell(row, self.consig_col, consig)
            self.sheet.update_cell(row, self.card_col, card)
            print('Cliente atualizado!')
            break
        except APIError:
            print('Esperando para atualizar...')
            time.sleep(100)
0 голосов
/ 14 апреля 2020

Вы можете поместить содержимое из Try: в отдельную функцию. если эта функция выдает ошибку, она будет автоматически перехвачена в вашем блоке "кроме:". там вы можете вспомнить упомянутую функцию.

...