Вопрос или проблема
У меня возникла проблема с программой, где происходит исключение вместе с командой try, и я не знаю, что делать, так как она печатает преобразование и сообщение об ошибке.
def main():
print('Что бы вы хотели конвертировать?')
print('1. Милли в километры')
print('2. Фаренгейт в Цельсий')
print('3. Галлоны в литры')
print('4. Фунты в килограммы')
print('5. Дюймы в сантиметры')
try:
option = int(input('Опция меню:'))
if option == 1:
Inptmiles = float(input('Введите количество миль для конверсии:'))
milestokm(Inptmiles)
usercontinue()
if option == 2:
InptFrnht = float(input('Введите градусы, которые вы хотите конвертировать:'))
FrnhttoClcs(InptFrnht)
usercontinue()
if option == 3:
InptGllns = float(input('Введите количество галлонов, которые вы хотите конвертировать:'))
GllnstoLtrs(InptGllns)
usercontinue()
if option == 4:
InptLbs = float(input('Введите количество фунтов, которые вы хотите конвертировать:'))
LbstoKgs(InptLbs)
usercontinue()
if option == 5:
InptInches = float(input('Введите количество дюймов, которые вы хотите конвертировать:'))
InchestoCm(InptInches)
usercontinue()
except:
print('Извините, при вводе произошла ошибка')
def milestokm(miles):
convkm = miles * 1.6
print(f'{miles} миль равно {convkm:.2f} километрам')
def FrnhttoClcs(Fahrenheit):
convClcs = (Fahrenheit - 32) * 5/9
print(f'{Fahrenheit} градусов Фаренгейта равно {convClcs:.2f} градусов Цельсия')
def GllnstoLtrs(Gallons):
convLtrs = Gallons * 3.9
print(f'{Gallons} галлонов равно {convLtrs:.2f} литрам')
def LbstoKgs(Pounds):
convKgs = Pounds * 0.45
print(f'{Pounds} фунтов равно {convKgs:.2f} килограммам')
def InchestoCm(Inches):
convCm = Inches * 2.54
print(f'{Inches} дюймов равно {convCm:.2f} сантиметрам')
main()
Я попробовал переместить исключение ниже, после команд определения, которые использовали сохраненные переменные, но это вернулось с ошибкой.
Ошибка возникает, потому что имя ‘usercontinue’ не определено.
Чтобы найти ошибку, я использовал этот фрагмент кода:
except Exception as e:
print(e)
Именно поэтому вам следует использовать try ... except ...
без указания конкретного исключения. Если вы повторно вызываете исключение, вы обнаружите, что проблема в отсутствующем определении:
except Exception as e:
print('Извините, при вводе произошла ошибка')
raise e
Вывод будет чем-то вроде:
...
Извините, при вводе произошла ошибка
Traceback (most recent call last):
File "<path>\main.py", line 60, in <module>
main()
File "<path>\main.py", line 32, in main
raise(e)
File "<path>\main.py", line 13, in main
usercontinue()
^^^^^^^^^^^^
NameError: имя 'usercontinue' не определено
Таким образом, вместо этого просто поймайте ожидаемое вами исключение и позвольте другим пройти, после того как вы исправите проблему:
except ValueError:
print('Извините, при вводе произошла ошибка')
...
def usercontinue():
# что бы вы здесь ни планировали
pass
Более простой метод для выполнения этого оператора сопоставления случаев, вместо использования вложенных условий if/else.
фрагмент:
choice = input("\nПожалуйста, выберите опцию из меню, введя номер выбора (1/2/3/4/5):")
match choice:
case '1':
Inptmiles = float(input('Введите количество миль для конверсии:'))
milestokm(Inptmiles)
case '2':
InptFrnht = float(input('Введите градусы, которые вы хотите конвертировать:'))
FrnhttoClcs(InptFrnht)
case '3':
InptGllns = float(input('Введите количество галлонов, которые вы хотите конвертировать:'))
GllnstoLtrs(InptGllns)
case '4':
InptLbs = float(input('Введите количество фунтов, которые вы хотите конвертировать:'))
LbstoKgs(InptLbs)
case '5':
InptInches = float(input('Введите количество дюймов, которые вы хотите конвертировать:'))
InchestoCm(InptInches)
case _:
print('Извините, при вводе произошла ошибка')
Ответ или решение
Обработка исключений в Python является важной частью разработки программного обеспечения, особенно в случаях, когда входные данные могут оказаться некорректными. В вашем случае проблема заключается в том, что программа вызывает ошибку, поскольку функция usercontinue()
не определена, и ошибка генерируется при попытке ее вызова. Давайте углубимся в решение этой проблемы, используя конструкцию try
и except
, а также улучшив общий стиль кода.
Проблема
Ошибка, с которой вы столкнулись, возникает из-за того, что код пытается вызвать несуществующую функцию usercontinue()
. Когда Python не может найти такой функции в текущем пространстве имен, он вызывает исключение NameError
. Ваша текущая конструкция try...except
не помогает устранить эту ошибку, поскольку она не конкретизирует, какое именно исключение вы хотите обрабатывать. Как результат, происходит перехват общего исключения, что затрудняет отладку.
Решение
-
Определение
usercontinue()
: Если эта функция необходима для логики вашей программы, определите ее, даже если она будет пустой. -
Спецификация обработки исключений: Предпочтительно обрабатывать конкретные исключения, такие как
ValueError
, возникающие при преобразовании данных с помощьюint()
илиfloat()
. Это позволяет вам проще находить и исправлять ошибки. -
Упрощение управления вариантами: Вместо многоуровневых
if
-условий, вы можете использовать конструкциюmatch
, которая появилась в Python 3.10, чтобы сделать код более чистым и понятным.
Исправленный код
Вот пример того, как ваш код может быть организован с учетом вышеописанных рекомендаций:
def main():
print('Какой перевод вам нужен?')
print('1. Мили в километры')
print('2. Фаренгейты в Цельсии')
print('3. Галлоны в литры')
print('4. Фунты в килограммы')
print('5. Дюймы в сантиметры')
try:
option = int(input('Выберите пункт меню: '))
match option:
case 1:
Inptmiles = float(input('Введите количество миль для преобразования: '))
milestokm(Inptmiles)
case 2:
InptFrnht = float(input('Введите температуру в Фаренгейтах: '))
FrnhttoClcs(InptFrnht)
case 3:
InptGllns = float(input('Введите количество галлонов: '))
GllnstoLtrs(InptGllns)
case 4:
InptLbs = float(input('Введите количество фунтов: '))
LbstoKgs(InptLbs)
case 5:
InptInches = float(input('Введите количество дюймов: '))
InchestoCm(InptInches)
case _:
print('Некорректный ввод. Пожалуйста, выберите число от 1 до 5.')
except ValueError:
print('Ошибка: Пожалуйста, введите числовое значение.')
def usercontinue():
# Реализуйте функциональность, соответствующую вашему замыслу
pass
def milestokm(miles):
convkm = miles * 1.6
print(f'{miles} Миль равно {convkm:.2f} Километрам.')
def FrnhttoClcs(Fahrenheit):
convClcs = (Fahrenheit - 32) * 5/9
print(f'{Fahrenheit} Фаренгейт равно {convClcs:.2f} Цельсия.')
def GllnstoLtrs(Gallons):
convLtrs = Gallons * 3.9
print(f'{Gallons} Галлонов равно {convLtrs:.2f} Литров.')
def LbstoKgs(Pounds):
convKgs = Pounds * 0.45
print(f'{Pounds} Фунтов равно {convKgs:.2f} Килограмм.')
def InchestoCm(Inches):
convCm = Inches * 2.54
print(f'{Inches} Дюймов равно {convCm:.2f} Сантиметрам.')
main()
Заключение
Улучшение обработки исключений и структуры программы делает ваш код более устойчивым и читаемым. Теперь, если вы введете некорректное значение, например, буквы вместо числа, программа выдаст сообщение об ошибке, а не незаконченный вызов функции, что облегчит процесс отладки и улучшит пользовательский опыт.