выполнение try и исключения в выводе

Вопрос или проблема

У меня возникла проблема с программой, где происходит исключение вместе с командой 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 не помогает устранить эту ошибку, поскольку она не конкретизирует, какое именно исключение вы хотите обрабатывать. Как результат, происходит перехват общего исключения, что затрудняет отладку.

Решение

  1. Определение usercontinue(): Если эта функция необходима для логики вашей программы, определите ее, даже если она будет пустой.

  2. Спецификация обработки исключений: Предпочтительно обрабатывать конкретные исключения, такие как ValueError, возникающие при преобразовании данных с помощью int() или float(). Это позволяет вам проще находить и исправлять ошибки.

  3. Упрощение управления вариантами: Вместо многоуровневых 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()

Заключение

Улучшение обработки исключений и структуры программы делает ваш код более устойчивым и читаемым. Теперь, если вы введете некорректное значение, например, буквы вместо числа, программа выдаст сообщение об ошибке, а не незаконченный вызов функции, что облегчит процесс отладки и улучшит пользовательский опыт.

Оцените материал
Добавить комментарий

Капча загружается...