Если ошибка повторить python

Decorator is a good approach.

from functools import wraps
import time

class retry:
    def __init__(self, success=lambda r:True, times=3, delay=1, raiseexception=True, echo=True):
        self.success = success
        self.times = times
        self.raiseexception = raiseexception
        self.echo = echo
        self.delay = delay
    def retry(fun, *args, success=lambda r:True, times=3, delay=1, raiseexception=True, echo=True, **kwargs):
        ex = Exception(f"{fun} failed.")
        r = None
        for i in range(times):
            if i > 0:
                time.sleep(delay*2**(i-1))
            try:
                r = fun(*args, **kwargs)
                s = success(r)
            except Exception as e:
                s = False
                ex = e
                # raise e
            if not s:
                continue
            return r
        else:
            if echo:
                print(f"{fun} failed.", "args:", args, kwargs, "nresult: %s"%r)
            if raiseexception:
                raise ex
    def __call__(self, fun):
        @wraps(fun)
        def wraper(*args, retry=0, **kwargs):
            retry = retry if retry>0 else self.times
            return self.__class__.retry(fun, *args, 
                                        success=self.success, 
                                        times=retry,
                                        delay=self.delay,
                                        raiseexception = self.raiseexception,
                                        echo = self.echo,
                                        **kwargs)
        return wraper

some usage examples:

@retry(success=lambda x:x>3, times=4, delay=0.1)
def rf1(x=[]):
    x.append(1)
    print(x)
    return len(x)
> rf1()

[1]
[1, 1]
[1, 1, 1]
[1, 1, 1, 1]

4
@retry(success=lambda x:x>3, times=4, delay=0.1)
def rf2(l=[], v=1):
    l.append(v)
    print(l)
    assert len(l)>4
    return len(l)
> rf2(v=2, retry=10) #overwite times=4

[2]
[2, 2]
[2, 2, 2]
[2, 2, 2, 2]
[2, 2, 2, 2, 2]

5
> retry.retry(lambda a,b:a+b, 1, 2, times=2)

3
> retry.retry(lambda a,b:a+b, 1, "2", times=2)

TypeError: unsupported operand type(s) for +: 'int' and 'str'

Put it inside a while loop and break out when you’ve got the input you expect. It’s probably best to keep all code dependant on imp in the try as below, or set a default value for it to prevent NameError‘s further down.

while True:
  try:
    imp = int(input("Importance:nt1: Highnt2: Normalnt3: Low"))

    # ... Do stuff dependant on "imp"

    break # Only triggered if input is valid...
  except ValueError:
    print("Error: Invalid number")

EDIT: user2678074 makes the valid point that this could make debugging difficult as it could get stuck in an infinite loop.

I would make two suggestions to resolve this — firstly use a for loop with a defined number of retries. Secondly, place the above in a function, so it’s kept separate from the rest of your application logic and the error is isolated within the scope of that function:

def safeIntegerInput( num_retries = 3 ):
    for attempt_no in range(num_retries):
        try:
            return int(input("Importance:nt1: Highnt2: Normalnt3: Low"))
        except ValueError as error:
            if attempt_no < (num_retries - 1):
                print("Error: Invalid number")
            else:
                raise error

With that in place, you can have a try/except outside of the function call and it’ll only through if you go beyond the max number of retries.

Сделайте while True внутри цикла for, поместите код try внутри и перерыв в этом цикле while только тогда, когда ваш код преуспеет.

for i in range(0,100):
    while True:
        try:
            # do stuff
        except SomeSpecificException:
            continue
        break

zneak
18 янв. 2010, в 06:57

Поделиться

Я предпочитаю ограничивать количество повторений, так что, если есть проблема с этим конкретным элементом, вы, в конце концов, перейдете к следующему:

for i in range(100):
  for attempt in range(10):
    try:
      # do thing
    except:
      # perhaps reconnect, etc.
    else:
      break
  else:
    # we failed all the attempts - deal with the consequences.

xorsyst
05 окт. 2011, в 15:08

Поделиться

Пакет повторных попыток — это хороший способ повторить блок кода при ошибке.

Например:

@retry(wait_random_min=1000, wait_random_max=2000)
def wait_random_1_to_2_s():
    print("Randomly wait 1 to 2 seconds between retries")

goneri
18 сен. 2014, в 13:48

Поделиться

Вот решение, подобное другим, но оно приведет к возникновению исключения, если ему не удастся выполнить заданное число или повторить попытку.

tries = 3
for i in range(tries):
    try:
        do_the_thing()
    except KeyError as e:
        if i < tries - 1: # i is zero indexed
            continue
        else:
            raise
    break

TheHerk
19 янв. 2016, в 21:27

Поделиться

Более «функциональный» подход без использования этих уродливых циклов while:

def tryAgain(retries=0):
    if retries > 10: return
    try:
        # Do stuff
    except:
        retries+=1
        tryAgain(retries)

tryAgain()

restbeckett
28 окт. 2010, в 21:51

Поделиться

Самый ясный способ — явно установить i. Например:

i = 0
while i < 100:
    i += 1
    try:
        # do stuff

    except MyException:
        continue

Tomi Kyöstilä
18 янв. 2010, в 06:18

Поделиться

Общее решение с тайм-аутом:

import time

def onerror_retry(exception, callback, timeout=2, timedelta=.1):
    end_time = time.time() + timeout
    while True:
        try:
            yield callback()
            break
        except exception:
            if time.time() > end_time:
                raise
            elif timedelta > 0:
                time.sleep(timedelta)

Использование:

for retry in onerror_retry(SomeSpecificException, do_stuff):
    retry()

Laurent LAPORTE
04 дек. 2014, в 19:25

Поделиться

Использование рекурсии

for i in range(100):
    def do():
        try:
            ## Network related scripts
        except SpecificException as ex:
            do()
    do() ## invoke do() whenever required inside this loop

Joseph Thomas
31 авг. 2016, в 12:31

Поделиться

В библиотеке Python Decorator есть нечто похожее.

Пожалуйста, имейте в виду, что это не проверка исключений, а возвращаемое значение. Повторяется до тех пор, пока оформленная функция не вернет True.

Немного измененная версия должна сделать свое дело.

Michael
15 июнь 2011, в 08:41

Поделиться

Вы можете использовать пакет повторной проверки Python.
Retrying

Это написано на Python, чтобы упростить задачу добавления поведения повтора к чему угодно.

ManJan
18 окт. 2017, в 17:54

Поделиться

Использование while и счетчика:

count = 1
while count <= 3:  # try 3 times
    try:
        # do_the_logic()
        break
    except SomeSpecificException as e:
        # If trying 3rd time and still error?? 
        # Just throw the error- we don't have anything to hide :)
        if count == 3:
            raise
        count += 1

Ranju R
31 авг. 2016, в 13:24

Поделиться

Если вы хотите найти решение без вложенных циклов и использования break при успехе, вы можете разработать быструю retriable для любой итерации. Вот пример сетевой проблемы, с которой я часто сталкиваюсь — срок сохраненной аутентификации истекает. Использование этого будет читать так:

client = get_client()
smart_loop = retriable(list_of_values):

for value in smart_loop:
    try:
        client.do_something_with(value)
    except ClientAuthExpired:
        client = get_client()
        smart_loop.retry()
        continue
    except NetworkTimeout:
        smart_loop.retry()
        continue

Mikhail
24 июль 2018, в 21:30

Поделиться

for _ in range(5):
    try:
        # replace this with something that may fail
        raise ValueError("foo")

    # replace Exception with a more specific exception
    except Exception as e:
        err = e
        continue

    # no exception, continue remainder of code
    else:
        break

# did not break the for loop, therefore all attempts
# raised an exception
else:
    raise err

Моя версия похожа на несколько выше, но не использует отдельный во while цикла, и вновь поднимает последнее исключение, если все повторные попытки терпят неудачу. Можно явно установить err = None наверху, но это не является строго необходимым, поскольку он должен выполнять только последний блок else если произошла ошибка и, следовательно, установлен err.

n8henrie
05 фев. 2019, в 16:26

Поделиться

Я использую следующие в моих кодах,

   for i in range(0, 10):
    try:
        #things I need to do
    except ValueError:
        print("Try #{} failed with ValueError: Sleeping for 2 secs before next try:".format(i))
        time.sleep(2)
        continue
    break

H S Rathore
21 нояб. 2018, в 07:52

Поделиться

Вот моя идея о том, как это исправить:

j = 19
def calc(y):
    global j
    try:
        j = j + 8 - y
        x = int(y/j)   # this will eventually raise DIV/0 when j=0
        print("i = ", str(y), " j = ", str(j), " x = ", str(x))
    except:
        j = j + 1   # when the exception happens, increment "j" and retry
        calc(y)
for i in range(50):
    calc(i)

Amine
24 дек. 2015, в 17:45

Поделиться

увеличивает вашу переменную цикла только тогда, когда предложение try успешно

appusajeev
18 янв. 2010, в 11:12

Поделиться

Ещё вопросы

  • 0Устранить ненужные десятичные дроби по результатам умножения
  • 0HTML с использованием DIV и таблицы
  • 1Использование универсального интерфейса внутри другого универсального интерфейса
  • 0Пароль типа предоставления Symfony2 FOSOAuthServerBundle требует секрет клиента
  • 0Удалить из всех таблиц, где ip равен ip
  • 0пакет udp не получен в QThread
  • 1Транспонировать CSV с помощью панд
  • 0Gmail SMTP с использованием CodeIgniter
  • 0Если элемент списка имеет дочерний список, добавьте стиль CSS
  • 1Как сопоставить шаблон регулярного выражения только в одной строке?
  • 0пытаясь заставить PHP разместить строку в файл
  • 1Выполнить поиск, используя HQL / какой тип присоединения к пользователю?
  • 0MySQL: транзакции PDO не работают должным образом
  • 0facebook v4 sdk class Ошибка изменения T_OBJECT_OPERATOR в файле FacebookSession.php
  • 1Как исправить мое приложение, которое вылетает вместо звонка?
  • 0C # (ASP .NET) исключение десериализации
  • 0Живые данные не отправляются с использованием ненавязчивой проверки MVC 4.5
  • 1Улучшение производительности метода Java
  • 1OData возвращает массив вместо JSON — Как конвертировать?
  • 1Котлин — Наследование в выражении объекта
  • 1Как интегрировать драйвер устройства в подсистему MDSS (MIPI-DSI) для моста MIPI-LVDS?
  • 0Вложенная функция C ++ с указателем в качестве возвращаемого значения
  • 1showSoftInputFromInputMethod устарела для Android P API 28
  • 0JQuery Datatable Следующая кнопка работает неправильно
  • 1Unity — CommandInvokationFailure: сборка Gradle завершилась неудачно
  • 1Вывод значений из списка ключей с помощью SQLAlchemy, Jinja2 и Flask
  • 0Как выбрать элемент кроме его дочерних элементов?
  • 1Вызов Python из VBA — возврат значения функции Python
  • 0Qt ActiveX извлекает количество страниц в текстовом документе
  • 1найти значение, соответствующее дате в пандах
  • 1Отображение значений и названий серий в JFreeChart
  • 1Вызов ImageMagick конвертировать из Java с исполняемой исполняющей
  • 1Внедрение зависимостей только для базовой активности приводит к сбою дочерней активности
  • 0Как извлечь только определенную дату-время из веб-ответа и сопоставить его с данной датой-временем?
  • 1Java — проблемы с подстрокой
  • 1жесткий пользовательский ImageDataGenerator
  • 1Regex для проверки пароля, возвращая false для правильных паролей
  • 0При использовании php html форма регистрации не отображается
  • 1Изменить значение вставки jsGrid на основе элемента управления select на странице
  • 0Горизонтальная страница контента Windows 8
  • 0Угловой дизайн материала md-autocomplete с md-max-length и рисунком
  • 1Получить индекс значения
  • 0Как разделить строку datetime 1 на 2 или более строк duration-mysql
  • 1Как расширить несколько миксинов в одном элементе Polymer?
  • 1Добавить пробел между виджетами WxPython
  • 0Как передать объект в качестве параметра функции скрипта Java на onClick
  • 0Показывать баннер только для определенной страны / IP-адресов?
  • 0Как не вводить пароль в декларативную директиву html / angularjs?
  • 1Создание линии с помощью кнопок TicTacToe
  • 0Фоновая ошибка навигации при наведении

Toggle table of contents sidebar

try/except#

Если вы повторяли примеры, которые использовались ранее, то наверняка
были ситуации, когда выскакивала ошибка. Скорее всего, это была ошибка
синтаксиса, когда не хватало, например, двоеточия.

Как правило, Python довольно понятно реагирует на подобные ошибки, и их
можно исправить.

Тем не менее, даже если код синтаксически написан правильно, могут
возникать ошибки. В Python эти ошибки называются исключения (exceptions).

Примеры исключений:

In [1]: 2/0
-----------------------------------------------------
ZeroDivisionError: division by zero

In [2]: 'test' + 2
-----------------------------------------------------
TypeError: must be str, not int

В данном случае возникло два исключения: ZeroDivisionError и
TypeError.

Чаще всего можно предсказать, какого рода исключения возникнут во время
исполнения программы.

Например, если программа на вход ожидает два числа, а на выходе выдает
их сумму, а пользователь ввел вместо одного из чисел строку, появится
ошибка TypeError, как в примере выше.

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

Примечание

Когда в программе возникает исключение, она сразу завершает работу.

Для работы с исключениями используется конструкция try/except:

In [3]: try:
   ...:     2/0
   ...: except ZeroDivisionError:
   ...:     print("You can't divide by zero")
   ...:
You can't divide by zero

Конструкция try работает таким образом:

  • сначала выполняются выражения, которые записаны в блоке try

  • если при выполнения блока try не возникло никаких исключений, блок except пропускается,
    и выполняется дальнейший код

  • если во время выполнения блока try в каком-то месте возникло исключение,
    оставшаяся часть блока try пропускается

    • если в блоке except указано исключение, которое возникло, выполняется код в блоке except

    • если исключение, которое возникло, не указано в блоке except,
      выполнение программы прерывается и выдается ошибка

Обратите внимание, что строка Cool! в блоке try не выводится:

In [4]: try:
   ...:     print("Let's divide some numbers")
   ...:     2/0
   ...:     print('Cool!')
   ...: except ZeroDivisionError:
   ...:     print("You can't divide by zero")
   ...:
Let's divide some numbers
You can't divide by zero

В конструкции try/except может быть много except, если нужны разные
действия в зависимости от типа ошибки.

Например, скрипт divide.py делит два числа введенных пользователем:

# -*- coding: utf-8 -*-

try:
    a = input("Введите первое число: ")
    b = input("Введите второе число: ")
    print("Результат: ", int(a)/int(b))
except ValueError:
    print("Пожалуйста, вводите только числа")
except ZeroDivisionError:
    print("На ноль делить нельзя")

Примеры выполнения скрипта:

$ python divide.py
Введите первое число: 3
Введите второе число: 1
Результат:  3

$ python divide.py
Введите первое число: 5
Введите второе число: 0
На ноль делить нельзя

$ python divide.py
Введите первое число: qewr
Введите второе число: 3
Пожалуйста, вводите только числа

В данном случае исключение ValueError возникает, когда пользователь
ввел строку вместо числа, во время перевода строки в число.

Исключение ZeroDivisionError возникает в случае, если второе число было
равным 0.

Если нет необходимости выводить различные сообщения на ошибки ValueError
и ZeroDivisionError, можно сделать так (файл divide_ver2.py):

# -*- coding: utf-8 -*-

try:
    a = input("Введите первое число: ")
    b = input("Введите второе число: ")
    print("Результат: ", int(a)/int(b))
except (ValueError, ZeroDivisionError):
    print("Что-то пошло не так...")

Проверка:

$ python divide_ver2.py
Введите первое число: wer
Введите второе число: 4
Что-то пошло не так...

$ python divide_ver2.py
Введите первое число: 5
Введите второе число: 0
Что-то пошло не так...

Примечание

В блоке except можно не указывать конкретное исключение или
исключения. В таком случае будут перехватываться все исключения.

Это делать не рекомендуется!

try/except/else#

В конструкции try/except есть опциональный блок else. Он выполняется в
том случае, если не было исключения.

Например, если необходимо выполнять в дальнейшем какие-то операции с
данными, которые ввел пользователь, можно записать их в блоке else (файл
divide_ver3.py):

# -*- coding: utf-8 -*-

try:
    a = input("Введите первое число: ")
    b = input("Введите второе число: ")
    result = int(a)/int(b)
except (ValueError, ZeroDivisionError):
    print("Что-то пошло не так...")
else:
    print("Результат в квадрате: ", result**2)

Пример выполнения:

$ python divide_ver3.py
Введите первое число: 10
Введите второе число: 2
Результат в квадрате:  25

$ python divide_ver3.py
Введите первое число: werq
Введите второе число: 3
Что-то пошло не так...

try/except/finally#

Блок finally — это еще один опциональный блок в конструкции try. Он
выполняется всегда, независимо от того, было ли исключение или нет.

Сюда ставятся действия, которые надо выполнить в любом случае. Например,
это может быть закрытие файла.

Файл divide_ver4.py с блоком finally:

# -*- coding: utf-8 -*-

try:
    a = input("Введите первое число: ")
    b = input("Введите второе число: ")
    result = int(a)/int(b)
except (ValueError, ZeroDivisionError):
    print("Что-то пошло не так...")
else:
    print("Результат в квадрате: ", result**2)
finally:
    print("Вот и сказочке конец, а кто слушал - молодец.")

Проверка:

$ python divide_ver4.py
Введите первое число: 10
Введите второе число: 2
Результат в квадрате:  25
Вот и сказочке конец, а кто слушал - молодец.

$ python divide_ver4.py
Введите первое число: qwerewr
Введите второе число: 3
Что-то пошло не так...
Вот и сказочке конец, а кто слушал - молодец.

$ python divide_ver4.py
Введите первое число: 4
Введите второе число: 0
Что-то пошло не так...
Вот и сказочке конец, а кто слушал - молодец.

Когда использовать исключения#

Как правило, один и тот же код можно написать и с использованием
исключений, и без них.

Например, этот вариант кода:

while True:
    a = input("Введите число: ")
    b = input("Введите второе число: ")
    try:
        result = int(a)/int(b)
    except ValueError:
        print("Поддерживаются только числа")
    except ZeroDivisionError:
        print("На ноль делить нельзя")
    else:
        print(result)
        break

Можно переписать таким образом без try/except (файл
try_except_divide.py):

while True:
    a = input("Введите число: ")
    b = input("Введите второе число: ")
    if a.isdigit() and b.isdigit():
        if int(b) == 0:
            print("На ноль делить нельзя")
        else:
            print(int(a)/int(b))
            break
    else:
        print("Поддерживаются только числа")

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

Важно в каждой конкретной ситуации оценивать, какой вариант кода более
понятный, компактный и универсальный — с исключениями или без.

Если вы раньше использовали какой-то другой язык программирования, есть
вероятность, что в нём использование исключений считалось плохим тоном.
В Python это не так. Чтобы немного больше разобраться с этим вопросом,
посмотрите ссылки на дополнительные материалы в конце этого раздела.

raise#

Иногда в коде надо сгенерировать исключение, это можно сделать так:

raise ValueError("При выполнении команды возникла ошибка")

Встроенные исключения#

В Python есть много встроенных исключений,
каждое из которых генерируется в
определенной ситуации.

Например, TypeError обычно генерируется когда ожидался один тип данных, а передали другой

In [1]: "a" + 3
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-5aa8a24e3e06> in <module>
----> 1 "a" + 3
TypeError: can only concatenate str (not "int") to str

ValueError когда значение не соответствует ожидаемому:

In [2]: int("a")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-d9136db7b558> in <module>
----> 1 int("a")
ValueError: invalid literal for int() with base 10: 'a'

You can use continue in Python try-except but ‘continue‘ is allowed within an ‘except‘ or ‘finally‘ only if the try block is in a loop. ‘continue‘ will cause the next iteration of the loop to start.

A simple example code tries putting two or more functions in a list and using a loop to call your function.

def f():
    print('Function f')


def g():
    print('Function g')


funcs = [f, g]
for func in funcs:
    try:
        func()
    except:
        continue

Output:

Python try except continue

How to continue for loop after exception?

Answer: After the first for-loop, add the try/except. Then if an error is raised, it will continue with the next file.

for infile in listing:
    try:
        if infile.startswith("ABC"):
            fo = open(infile,"r")
            for line in fo:
                if line.startswith("REVIEW"):
                    print infile
            fo.close()
    except:
        pass

Source: https://stackoverflow.com/questions/18994334

How to ignore an exception and proceed?

Answer: The standard “nop” in Python is the pass statement, Use this code.

try:
    do_something()
except Exception:
    pass

Using except Exception instead of a bare except avoid catching exceptions like SystemExit, KeyboardInterrupt etc.

Read: Python docs for the pass statement

Do comment if you have any doubts or suggestions on this Python exception-handling topic.

Note: IDE: PyCharm 2021.3.3 (Community Edition)

Windows 10

Python 3.10.1

All Python Examples are in Python 3, so Maybe its different from python 2 or upgraded versions.

Degree in Computer Science and Engineer: App Developer and has multiple Programming languages experience. Enthusiasm for technology & like learning technical.

  • Если ошибка может быть совершена она будет совершена
  • Если ошибка или ноль то
  • Если ошибка впр ложь
  • Если ошибка впр excel примеры
  • Если ошибка аппроксимации отрицательная