Почему возникает UnboundLocalError при возникновении исключения и использовании input ()? - PullRequest
2 голосов
/ 12 марта 2020

Когда я запрашиваю ввод и преобразовываю его в целое число, используя int (), а когда вы вводите целое число, это обрабатывается, как без проблем. Однако, когда пользователь вводит неправильное значение, он выдает мне две ошибки, даже если я использовал обработку исключений. Вот код:

def rand_num():
    try:
        print("Welcome to the random number generator!")
        print()
        rand_max = int(input("Enter the maximum number to randomly generate: "))
        print()
        print(f"Your random number is: {random.randint(0, rand_max)}")
    except:
        print(f"Sorry, {rand_max} is not an integer!")

А вот и ошибки:

Original exception was:
Traceback (most recent call last):
  File "py_cli_calc.py", line 17, in rand_num
    rand_max = int(input("Enter the maximum number to randomly generate: "))
ValueError: invalid literal for int() with base 10: 'str'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "py_cli_calc.py", line 23, in <module>
    rand_num()
  File "py_cli_calc.py", line 21, in rand_num
    print(f"Sorry, {rand_max} is not an integer!")
UnboundLocalError: local variable 'rand_max' referenced before assignment

Я пытался поместить разные блоки кода в блок try, но я так растерялся, почему исключение не работает так, как я планировал (предполагается, что за исключением ValueError, если пользователь вводит неверный тип. Кроме того, я не понимаю, почему я получаю UnboundLocalError, потому что моя переменная rand_max не доступна для исключения? перестановка кода различными способами, например, размещение переменной, которая вызывает ошибку, за пределами попытки, но я все еще получаю UnboundLocalError! Я так запутался в этом, поэтому, пожалуйста, помогите мне!

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Если вы посмотрите на предыдущую ошибку (ValueError: invalid literal for int() with base 10: 'str'), ваша переменная rand_max не будет назначена, это приведет к последней ошибке:

UnboundLocalError: local variable 'rand_max' referenced before assignment
0 голосов
/ 12 марта 2020

Обновление: я исправил это! Вот код:

def rand_num():
    print("Welcome to the random number generator!")
    while True:
        print()
        rand_max = input("Enter the maximum number to randomly generate: ")
        try:
            if rand_max == "quit" or rand_max == "exit":
                print("Thanks for using the random number generator!")
                break
            else:
                print()
                print(f"Your random number is: {random.randint(0, int(rand_max))}")
        except ValueError:
            print(f"Sorry, {rand_max} is not an integer!")

Я переназначил rand_max на обычный строковый ввод (), но затем я преобразовал вход в блок try с помощью int (), если вход не равен «выход» или «выход» ». Затем я использую except ValueError, чтобы напечатать сообщение об ошибке, если блок try обнаружил, что введенный ввод не относится к типу int, и это сработало. Спасибо за помощь, особенно с UnboundLocalError, потому что это действительно сбило меня с толку!

...