Попробуйте + Except только для определенных исключений - PullRequest
2 голосов
/ 16 июня 2020

TL; DR: Почему мои исключения срабатывают только в определенных ситуациях, несмотря на то, что это та же ошибка?

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

Например:

print (better_cal c (5, 5, 5))

Это возвращает желаемое сообщение об исключении:

5 5 5 = Ошибка: ошибка имени. Пожалуйста, проверьте введенные вами данные

Однако другие ошибки не обнаруживаются. Вместо этого он завершает программу. Например,

print (better_cal c (5, g, 5))

Это возвращает «NameError: name 'g' is not defined '» , без запуска исключения или сообщения об исключении.

Аналогично

print (better_cal c (5, *, 5))

Это возвращает «SyntaxError: недопустимый синтаксис», не вызывая исключения или сообщения об исключении.

Я понимаю, что если бы я включил в оператор кавычки, код будет работать, однако моя цель - вызвать исключения.

def better_calc(num1, op, num2):
    try:
        if op == "+":
            result = num1+num2
        elif op == "-":
            result = num1-num2
        elif op == "*":
            result = num1*num2
        elif op == "/":
            num1/num2
    except NameError:
        print(f"Error: Name error. Please check your input")
    except UnboundLocalError:
        print(f"Error: Value error. Please check your input")
    except SyntaxError:
        print(f"Error: Syntax Error. Please check your input")

    print(num1, op, num2, "=")
    return result

print(better_calc(5, 5, 5))

1 Ответ

1 голос
/ 16 июня 2020

Чтобы объединить ответы, уже данные в комментариях, блоки try / except могут обрабатывать только ошибки, возникающие между try: и первым except блоком.

try:
    # raised exceptions in this block can be caught
    foo = "bar"
except FooError:
    # catches a raised FooError but any exceptions raised here are
    # outside of the try block and will not be handled. Another try/except
    # block could be added here to catch these exceptions
    pass
except Exception as e:
    # a trick to log exceptions but then let the exception run
    print(e)
    raise

Вызов функция print(better_calc(5, g, 5)) находится за пределами блока try функции и не будет обнаружена.

А синтаксические ошибки, такие как print(better_calc(5, *, 5)), не позволяют программе даже работать, что определенно выходит за пределы try функции блок.

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