Обработка исключений для различных входных данных в Python

#python

Вопрос:

я новичок в python, и я пытался создать программу BMICalculator, и в настоящее время я сталкиваюсь с проблемой, когда вы открываете программу, она запрашивает у пользователя ввод их роста и веса, и я создал обработку исключений для попыток, когда пользователь пытается ввести строку в свой ввод роста/веса, но проблема в том, что когда пользователь правильно вводит свой рост, а затем использует строку для своего веса, мое исключение ValueError появляется, но заставляет пользователя снова вводить свой рост, что не удобно для пользователя, Так что я хочу сделать, но не знаю, как это сделать.: Чтобы снова попросить пользователя ввести вес, а не рост, так как он уже ввел этот Мой код:

 import math
import time


def BMICalculator():
    print("BMI Calculator!")
    try:
        Height = float(input("Enter your Height: "))
        Weight = float(input("Enter your Weight: "))
        Result = Weight / (Height / 100) ** 2

        print("Your BMI is: ", round(Result, 1))

        if Result <= 18.5:
            print("You are underweight")
        elif Result <= 24.9:
            print("You are healthy")
        elif Result <= 29.9:
            print("You are overweight")
        elif Result > 29.9:
            print("You are obese")
    except ValueError:
        print("Please enter a valid number")
        BMICalculator_NoWelcomingMessage()


def BMICalculator_NoWelcomingMessage():
    try:
        Height = float(input("Enter your Height: "))
        Weight = float(input("Enter your Weight: "))
        Result = Weight / (Height / 100) ** 2

        print("Your BMI is: ", round(Result, 1))

        if Result <= 18.5:
            print("You are underweight")
        elif Result <= 24.9:
            print("You are healthy")
        elif Result <= 29.9:
            print("You are overweight")
        elif Result > 29.9:
            print("You are obese")
    except ValueError:
        print("Please enter a valid number")
        BMICalculator_NoWelcomingMessage()


def enter_again():
    user = input("Do you want to enter again?: ").lower()

    while user not in ['yes', 'y', 'no', 'n']:
        print("Please enter a valid input")
        user = input("Do you want to enter again?: ").lower()
    if user not in ['yes', 'y']:
        print("Have a nice day!")
        time.sleep(1)
    elif user not in ['no','n']:
        BMICalculator_NoWelcomingMessage()
        enter_again()


BMICalculator()
enter_again()
 

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

1. Вместо BMICalculator_NoWelcomingMessage() » Почему бы тебе не позвонить BMICalculator() ?» Кроме того, имейте в виду максимальный предел рекурсии

Ответ №1:

Ну, причина, по которой это происходит, заключается в том, что у вас есть один оператор catch для обоих входных данных, и если какой-либо из них выдает ошибку, вы перезапускаете весь процесс.

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

 def BMICalculator():
    print("BMI Calculator!")
    while True:
        try:
            Height = float(input("Enter your Height: "))
            break
        except ValueError:
            print("Please enter a valid number")
    while True:
        try:
            Weight = float(input("Enter your Weight: "))
            break
        except ValueError:
            print("Please enter a valid number")
        
    Result = Weight / (Height / 100) ** 2
    print("Your BMI is: ", round(Result, 1))
 

Примечание: Вы, вероятно, можете проанализировать входные данные в отдельной функции и вызвать эту функцию при вводе данных для веса и роста, что сделает код чище. Что-то вроде этого, возможно:

 def parse_input(InputName):
    while True:
        try:
            value = float(input(f"Enter your {InputName}: "))
            break
        except ValueError:
            print("Please enter a valid number")
    return value

def BMICalculator():
    print("BMI Calculator!")
    Height = parse_input("Height")
    Weight = parse_input("Weight")
    Result = Weight / (Height / 100) ** 2
    print("Your BMI is: ", round(Result, 1))