Есть ли способ продолжить с того места, где произошла ошибка, вместо повторения?

#python #for-loop #while-loop #try-catch #valueerror

#python #для цикла #цикл while #попробуйте-поймать #ошибка значения

Вопрос:

У меня есть этот цикл

 for i in range(branches):
    count  = 1
    while True:
        try:
            computer = int(input('{} {} :'.format("Enter number of books for computer of branch", count)))
            bookCount.append(computer)
            physics = int(input('{} {} :'.format("Enter number of books for phsyics of branch", count)))
            bookCount.append(physics)
            chemistry = int(input('{} {} :'.format("Enter number of books for chemistry of branch", count)))
            bookCount.append(chemistry)
            biology = int(input('{} {} :'.format("Enter number of books for biology of branch", count)))
            bookCount.append(biology)
            arts = int(input('{} {} :'.format("Enter number of books for arts of branch", count)))
            bookCount.append(arts)
        except ValueError:
            print("Input must be a number")
            continue
        if computer < 1:
            print("Number must be at least 1")
        else:
            break
 

Если я введу say «Hello» вместо int , try except обнаружит проблему и выведет ошибку, но перезапустится с начала цикла try.
Есть ли способ продолжить с того места, где произошла ошибка, или все они должны быть разделены?

Редактировать::::

Я попробовал несколько способов форматирования этого сейчас, например, ниже, но он всегда возвращается к верхнему вводу

 for i in range(branches):
    count  = 1
    while True:
        try:
            computer = int(input('{} {} :'.format("Enter number of books for computer of branch", count)))
            bookCount.append(computer)
            try:
                physics = int(input('{} {} :'.format("Enter number of books for physics of branch", count)))
                bookCount.append(physics)
            except ValueError:
                print("Input must be a number:")
                continue
        except ValueError:
            print("Input must be a number")
            continue
        if computer < 1:
            print("Number must be at least 1")
        else:
            break
 

Любая помощь была бы отличной

Комментарии:

1. Да, вам нужно поместить цикл вокруг каждого ввода, чтобы делать то, что вы хотите сделать

2. Хорошо, я попробовал несколько способов форматирования этого сейчас, но он все равно возвращается к первому вводу каждый раз.

Ответ №1:

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

 def get_input(request_string, count):
    
    while True:
        try:
            value = int(input('{} {} :'.format(request_string, count)))
        except ValueError:
            print("Input must be a number")
            continue

        if value < 1:
            print("Number must be at least 1")
        else:
            return value 

for count in range(branches):
    
    bookcount.append(get_input("Enter number of books for computer of branch", count))
    bookcount.append(get_input("Enter number of books for phsyics of branch", count))
    ...
 

Комментарии:

1. Я думаю, вам следует сделать bookcount dict, а не list, чтобы вы могли выполнять bookcount["computer"] = 1 , и у вас могли быть строки запроса в аналогичном dict, чтобы вы могли просто повторить это, например for each booktype bookcount[booktype] = get_input(booktype) Вероятно, вам следует также дать людям выход из цикла while() , например, если входные данные равны нулю, почему бы не принять их и сохранить, а не жаловаться?

2. Потому что breif требует, чтобы это было указано как ошибка, к сожалению. Старые добрые задания uni.

3. Я знаю, что университеты могут быть отрезаны от реального мира, но я бы подумал, что концепция нуля уже дошла до них! Хороший разработчик бросает вызов глупым запросам! («Что, если книг нет?»)