Возникает непредвиденное исключение при попытке преобразовать входную строку в число с плавающей точкой - PullRequest
1 голос
/ 30 мая 2019

Я хочу попросить пользователя ввести значение, а затем распечатать его длину, если ввод является строкой.Если пользовательский ввод является целым или десятичным, я хочу напечатать "Sorry, integers don't have length" или "Sorry, floats don't have length", соответственно.

Я использую исключение при попытке преобразовать ввод в число с плавающей точкой или целое число.

Вот мой код:

c=input("enter a string: ")

def length(c):
    return len(c)

try:
    float(c)
    if float(c)==int(c):
        print("Sorry integers don't have length")
    else:
        print("Sorry floats don't have length")
except:
    print(length(c))

Результаты вывода следующие:

> enter a string: sfkelkrelte
11
> enter a string: 21
Sorry integers don't have length
> enter a string: 21.1
4

При вводе целого числа сообщение об ошибке отображается правильно, каквозможно преобразование float ().Но в случае числа с плавающей запятой интерпретатор переходит к блоку except, хотя он должен был выполнить блок try.

Почему это происходит?

Ответы [ 3 ]

1 голос
/ 30 мая 2019

Кроме того, почему бы не применить принцип EAFP ( Что такое принцип EAFP в Python? ) и ко второму условию?

s = input("Input: ")
try:
    float(s)
    try:
        int(s)
        print("Sorry, you have entered an integer.")
    except:
        print("Sorry, you have entered a float.")
except:
    print(len(s))

Я исключил проверку на ValueError как исключение, потому что вы также не проверяли это в своем коде. Тем не менее, вы должны взглянуть на Как правильно игнорировать исключения

0 голосов
/ 30 мая 2019

Ввод результатов в формате строки, поэтому преобразуйте строку в число с плавающей точкой. Затем проверьте, является ли оно целым числом. Измените свой код на:

old: if float(c) ==int(c):

new: if c.isdigit():

ОБНОВЛЕНИЕ:

enter a string: 21.0
Sorry floats don't have length
0 голосов
/ 30 мая 2019

Часть, которая вызывает исключение: int(c):

c = "21.1"
print(int(c))
# ValueError: invalid literal for int() with base 10: '21.1'

Одно незначительное изменение исправит это для вас:

c="21.1"

try:
    float(c)
    if "." not in c: #<---- check if "." is in the string c AFTER conversion to float
        print("Sorry integers don't have length")
    else:
        print("Sorry floats don't have length")
except:
    print(len(c))
# Sorry floats don't have length

Однако ,как правило, плохо слепо ловить все исключения.Это может привести к непреднамеренному побочному эффекту любой ошибки в вашей программе, запускающей блок except.

Было бы более уместно поймать только ту, которую вы ожидаете.

c="21.aakdjs1"

try:
    float(c)
    if "." not in c:
        print("Sorry integers don't have length")
    else:
        print("Sorry floats don't have length")
except ValueError:
    print(len(c))
# 10

Для дальнейшей отладки вы всегда можете напечатать исключение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...