Как правильно использовать блок try / catch в случае цикла for? - PullRequest
0 голосов
/ 26 апреля 2019

Я не совсем понимаю, как использовать блок try-catch с циклами for. Есть ли какой-то стандарт, которому мы должны следовать для этого. Вот некоторые примеры кодов. Какой из них должен быть предпочтительным подходом?

def func1():
    try:
        for i in range():
            do_something()
    except:
        print(error)


def func1():
    for i in range():
        try:
            do_something()
        except:
            print(error)

Или в случае использования нескольких циклов for:

def func3():
    try:
        for i in range():
            for j in range():
                do_something()
    except:
        print(error)

def func4():
    for i in range():
        for j in range():
            try:
                do_something()
            except:
                print(error)

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Это зависит от вашей ситуации.

Если для продолжения вам понадобится завершить успешную операцию, вы можете поместить try / catch вне цикла.

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

Например, загрузка содержимого с веб-сайта (цикл не будет прерываться, когдаошибка):

contents = []
for i in range(100):
  try:
    contents.append(requests.get("http://example.com/%d.html" % i))
  except:
    print("page %d is not available.", i)

Обновление игры или приложений (при ошибке прервите цикл):

updateList = ["File1.jpg", "File2.jpg"]
try:
  for file in updateList:
    res = requests.get("http://example.com/%s" % file)
except:
  print("Update has failed, application cannot continue.")
1 голос
/ 26 апреля 2019

Зависит от условия, если у вас есть кратный цикл for, и функция во внутреннем цикле выдает ошибку, хотите ли вы продолжить выполнение цикла for для других входов, или вы хотите полностью остановить выполнение цикла for .

Если вы хотите продолжить выполнение цикла, то использование try catch внутри цикла for имеет смысл, как показано ниже, так что вы все еще продолжаете цикл

Как всегда, вы можете иметь условие finally в любой логике try-catch, которая может что-то для вас сделать!


def func4():
    for i in range():
        for j in range():
            try:
                do_something()
            except:
                print(error)

Но если вы хотите прекратить зацикливание в случае возникновения исключения, сохранение try-catch вне цикла имеет смысл

def func3():
    try:
        for i in range():
            for j in range():
                do_something()
    except:
        print(error)

В первом подходе есть предостережение, когда у вас есть цикл, работающий 100 раз, а исключение выдается 10 раз, возможно, вам нужно обрабатывать его каждый раз по-другому или подавлять, и вы не уверены, что больше исключений будет сгенерировано, как только будет запущено больше циклов. Примером, когда перехват исключений внутри цикла for полезен, может быть, если вы обрабатываете список списков, и у некоторых подсписков есть плохие элементы, и вы хотите игнорировать их и сохранить res.t

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

...