[英]Python Exception Handling - BMI CALCULATOR
我正在 python 中编写一个 BMI 计算器,并想添加异常处理。 我创建了两个函数 1. 一个高度转换器,根据用户的输入将高度转换为英尺或米,以及一个重量转换器,根据输入将用户的体重转换为公斤或磅。 当用户输入错误的输入时,def height_converter(h) 和 weight_converter(w) 函数不会重新启动,这与下面的代码不同,它只询问体重和高度。 另外,BMI变量返回错误,我不知道该怎么办了
# 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")
在您的 weight_converter function 中,您只会在用户输入错误输入时返回转换后的值。 在 Python 中,缩进决定了语句属于哪个代码块。 您需要将 return 语句放在与 while True 相同的缩进级别:这将它放在 while 循环之外,并且它基本上会在你们中的一个人休息后发生。
height_converter function 也有类似的问题。
此外,您仅在其中一个函数中引发 ValueError ,并且由于您在 except 块中捕获它们,因此它们不会传播到调用者。
这段代码的异常处理似乎增加了不必要的复杂性。 仅仅为了让下一行代码做一些不同的事情而引发 ValueError 是矫枉过正和令人困惑的。 这是一个更简单的 weight_converter function 版本。
def weight_converter(w):
while True:
weight_unit = input("What is the weight unit Kgs or Lbs: ")
if weight_unit.upper() == "KG":
conversion = 1.0
break
elif weight_unit.upper() == "LBS":
conversion = 2.2
break
else
print("ERROR")
converted = w / conversion
print("weight in kg is: ", converted)
return converted
未捕获的异常沿调用堆栈向上传播,直到它们被 except 块捕获。 如果它们没有被捕获,它们会导致解释器停止程序并通常打印堆栈跟踪。 如果此代码导致异常,它们将被调用者中的异常处理程序捕获。 如果您在此 function 中抓住它们,它们将永远无法弥补调用者的损失。
测试您的代码,在转换函数中,代码块末尾的返回操作实际上并未被执行,因为它在逻辑上位于代码块的缩进中。 因此,您实际上是在向调用这些函数的语句返回“无”。
考虑到这一点,以下是您的代码,其中进行了一些调整,以从体重和身高转换函数返回转换后的值。
# BMI CALCULATOR IN PYTHON
import os
from datetime import date # FYI, I revised this a bit as well for the 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)
break
except (ValueError, IOError, IndexError):
print("ERROR")
return 0.0
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
break
except(ValueError,IOError,IndexError):
print("ERROR")
return 1.0
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")
我应用了蛮力方法来确保返回值。 或者,您可以将 function 块中的最后一个返回改进为只有一个返回,但我只是想避免在提供快速调整时可能出现的 scope 问题。
这产生了以下示例结果。
@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: lbs
weight in kg is: 77.27272727272727
What is your height: 5.83333
what is the height unit meters or feet: feet
height in meters is: 1.7779122218835721
Your BMI is: 24.445876294351564 as of 2022-09-06
You are using a posix system
试试看。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.