отлов ошибки ввода - PullRequest
       78

отлов ошибки ввода

0 голосов
/ 01 октября 2019

Я сделал простой калькулятор, и я пытаюсь отловить ошибку с помощью функции try и исключением, но по какой-то причине она не перехватывает ошибку. Ошибка, когда я помещаю что-либо, кроме числа, на входе num1 или num2. Я получаю ValueError, но я помещаю ValueError в блок исключений, и он все еще не перехватывает его. Я хочу, чтобы он перехватил ошибку и вывел недопустимое число вместо того, чтобы выдавать ошибку в pycharm.

num1 = float(input("give a number"))
op = input("give an operator")
num2 = float(input("give a number"))


try:
    if op == "/":
     print(num1/num2)
    elif op == "*":
     print(num1*num2)
    elif op == "-":
     print(num1-num2)
    elif op == "+":
     print(num1+num2)
    else:
     if op != "/*-+":
         print("invalid operator")
except ValueError:
    print("invalid number")

это ошибка, которую дает мне

give a number+
Traceback (most recent call last):
  File "C:/Users/Kalen/PycharmProjects/m/m.py", line 3, in <module>
    num1 = float(input("give a number"))
ValueError: could not convert string to float: '+'

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Вы пытаетесь преобразовать входные данные в числа с плавающей точкой до блока catch, поэтому ошибка появляется перед блоком catch и не перехватывается. Прочитайте входные данные вне блока catch, но приведите их к плавающим значениям позже внутри блока catch.

Еще лучше, вместо того, чтобы пытаться привести и бросить ValueErrors, сначала проверьте, является ли строка на самом деле числом. Сделайте это с string.isdigit () .

Проверка входных данных путем создания и перехвата исключений является плохой практикой. Общий совет - проверять и проверять все виды условий, которые вы можете разумно ожидать, и отлавливать и генерировать исключения только в тех ситуациях, которые вы не можете предвидеть. Когда вы пишете предложение try-catch, вы предполагаете, что какая-то ошибка может произойти по какой-то причине вне вашего контроля, но вы не знаете, почему, где или как. генерирование исключений предназначено для ошибок, а не только для нормального предсказуемого потока программы.

if not (num1.isdigit() and num2.isdigit()):
      print("invalid number")
else:
      // proceed


0 голосов
/ 02 октября 2019
num1 = input("give a number")
op = input("give an operator")
num2 = input("give a number")

try:
    num1=float(num1)
    num2=float(num2)
    if op == "/":
     print(num1/num2)
    elif op == "*":
     print(num1*num2)
    elif op == "-":
     print(num1-num2)
    elif op == "+":
     print(num1+num2)
    else:
     if op != "/*-+":
         print("invalid operator")
except ValueError:
    print("invalid number")

Попробуйте, надеюсь, это будет работать, как и ожидалось.

...