Найти - Пользователи
Полная версия: Не обрабатывается ошибка TypeError
Начало » Python для новичков » Не обрабатывается ошибка TypeError
1
Gosha777
Всем привет. Ввожу данный скрипт и у меня не обрабатывается исключение TypeError, хоть и возникает в среде Microsoft Visual Studio.

 try:
    first_number = input('Print first number: ')
    second_number = input('Print second number: ')
    sub = int(first_number) - int(second_number)
    print(sub)
except TypeError:
    print('Print not string, please...')
old_monty
Чтобы возникло исключение TypeError, на входе должно быть что-то вроде такого:
 >>> 'a' - 'b'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'str'
У вас в операции вычитания делается приведение обоих операндов к типу int. Если возникнет исключение, то это будет ValueError:
 >>> int('a') - int('b')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'a'
Gosha777
old_monty
Чтобы возникло исключение TypeError, на входе должно быть что-то вроде такого:
Ок, спасибо. Так а как мне тогда это сделать в виде программы, а не в интерактивной консоли? Ведь, если я не задаю тип int, то у меня высвечиваются цифры, после ввода пользователем, как строки.
old_monty
Gosha777
если я не задаю тип int, то у меня высвечиваются цифры, после ввода пользователем, как строки
Конечно, результат возвращенный input(), это строка, перед вычитанием ее необходимо приводить к int. А исключение отлавливать не TypeError, а ValueError. Хотя мне думается, что здесь лучше обойтись вообще без исключений. У любой строки можно вызвать метод isdigit(), он возвращает True, если строка содержит только цифры, иначе False:
 >>> "0123".isdigit(), "123abc".isdigit(), "abc123".isdigit() 
(True, False, False)
PEHDOM
 except (TypeError, ValueError):
py.user.next
old_monty
У любой строки можно вызвать метод isdigit(), он возвращает True, если строка содержит только цифры, иначе False:
str.isdigit() на первое время пойдёт, на постоянное время лучше сделать через regexp. Но уж точно не через исключение из int() это делается, потому что int() пропускает строки в которых могут быть не только цифры.

  
>>> int('\n\r\f\t+0123\n \n')
123
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB