I am coding a BMI calculator in python and wanted to add exception handling. I created two functions 1. a height converter that converts the height to feet or meters depending on the user's input, and a weight converter that converts the user's weight to kg or pounds depending on the input. The def height_converter(h) and weight_converter(w) functions don't restart when the user types in the wrong input, unlike the codes below it which asks only for the weight and height. Also, the BMI variable returns an error, I don't know what to do again
# BMI CALCULATOR IN PYTHON
import os
from datetime import datetime
# define our clear function
def clear():
# for windows
if os.name == 'nt':
os.system('cls')
# for mac and linux(here, os.name is 'posix')
else:
_ = os.system('clear')
def weight_converter(w):
while True:
try:
global converted
converted = 0
weight_unit = input("What is the weight unit Kgs or Lbs: ")
if weight_unit.upper() == "KG":
converted = w / 1
print("weight in kg is: ", converted)
elif weight_unit.upper() == "LBS":
converted = w / 2.2
print("weight in kg is: ", converted)
else:
raise ValueError(weight_unit)
break
except (ValueError, IOError, IndexError):
print("ERROR")
return converted
def height_converter(h):
while True:
try:
height_unit = input("what is the height unit meters or feet: ")
if height_unit.upper() == "METERS":
converted = h / 1
print("height in meters is: ", converted)
elif height_unit.upper() == "FEET":
converted = h / 3.281
print("height in meters is: ", converted)
break
except(ValueError,IOError,IndexError):
print("ERROR")
return converted
while True:
try:
age = input("How old are you? ")
age = int(age)
weight = input("What is your weight: ")
weight = float(weight)
wconverted = weight_converter(weight)
height = input("What is your height: ")
height = float(height)
hconverted = height_converter(height)
break
except ValueError:
# os.system(clock_settime)
print("No valid integer! Please try again ...")
clear()
BMI = float(wconverted / (hconverted ** 2))
print("Your BMI is: ", BMI, "as of ", date)
print("You are using a", os.name, "system")
Testing out your code, in the conversion functions, the return operation at the end of the code blocks were not actually being executed because of where it logically resided within the indentation of the code block. So, you were effectively returning a "None" to the statements calling those functions.
With that in mind, following is your code with some tweaks to return a converted value from the weight and height conversion functions.
# BMI CALCULATOR IN PYTHON
import os
from datetime import date
# define our clear function
def clear():
# for windows
if os.name == 'nt':
os.system('cls')
# for mac and linux(here, os.name is 'posix')
else:
_ = os.system('clear')
def weight_converter(w):
while True:
try:
global converted
converted = 0
weight_unit = input("What is the weight unit Kgs or Lbs: ")
if weight_unit.upper() == "KG":
converted = w / 1
print("weight in kg is: ", converted)
return converted # Made sure a decimal value was being returned
elif weight_unit.upper() == "LBS":
converted = w / 2.2
print("weight in kg is: ", converted)
return converted # Same here
else:
raise ValueError(weight_unit)
except (ValueError, IOError, IndexError):
print("ERROR - Please enter proper unit of measure")
def height_converter(h):
while True:
try:
height_unit = input("what is the height unit meters or feet: ")
if height_unit.upper() == "METERS":
converted = h / 1
print("height in meters is: ", converted)
return converted # And here
elif height_unit.upper() == "FEET":
converted = h / 3.281
print("height in meters is: ", converted)
return converted # And finally here
else:
raise ValueError(height_unit)
except(ValueError,IOError,IndexError):
print("ERROR - Please enter proper unit of measure")
while True:
try:
age = input("How old are you? ")
age = int(age)
weight = input("What is your weight: ")
weight = float(weight)
wconverted = weight_converter(weight)
height = input("What is your height: ")
height = float(height)
hconverted = height_converter(height)
break
except ValueError:
# os.system(clock_settime)
print("No valid integer! Please try again ...")
clear()
BMI = float(wconverted / (hconverted ** 2))
print("Your BMI is: ", BMI, "as of ", date.today()) # You had not defined the variable "date"
print("You are using a", os.name, "system")
I applied a brute force method to make sure a value was being returned. Alternatively, you might refine that last return in your function block to only have one return, but I just wanted to avoid possible scope issues in providing a quick tweak.
That produced the following sample results.
@Una:~/Python_Programs/BMI$ python3 Calculator.py
How old are you? 66
What is your weight: 170
What is the weight unit Kgs or Lbs: lb
ERROR - Please enter proper unit of measure
What is the weight unit Kgs or Lbs: kilos
ERROR - Please enter proper unit of measure
What is the weight unit Kgs or Lbs: lbs
weight in kg is: 77.27272727272727
What is your height: 5.83333
what is the height unit meters or feet: inches
ERROR - Please enter proper unit of measure
what is the height unit meters or feet: feet
height in meters is: 1.7779122218835721
Your BMI is: 24.445876294351564 as of 2022-09-08
You are using a posix system
Give that a try.