Заметки по Python (22): ошибки и исключения

искусственный интеллект Python
Заметки по Python (22): ошибки и исключения

Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.

Привет всем, яодна чаша в неделю, передняя часть, которая не хочет быть пьяной (завернутой). Если написанной статье посчастливилось получить вашу благосклонность, мне очень повезло~

В ежедневном процессе изучения Python из-за моего ограниченного уровня программирования мне действительно неудобно время от времени выбрасывать исключение, в процессе обучения я обнаружил, что ошибки в Python делятся на два типа: синтаксические ошибки и исключения.

Грамматические ошибки

Синтаксические ошибки в Python обычно являются наиболее очевидными ошибками.Поскольку код написан не так, как требуется, он часто подвержен синтаксическим ошибкам.

образец кода

>>> print("hello world)
  File "<stdin>", line 1
    print("hello world)
                      ^
SyntaxError: EOL while scanning string literal
>>> while True print("hello world")
  File "<stdin>", line 1
    while True print("hello world")
                   ^
SyntaxError: invalid syntax

Интерпретатор синтаксиса Python находит первую ошибку и отмечает ее маленькой стрелкой под ней.

аномальный

Что такое исключение? Исключение — это событие, возникающее во время выполнения программы и влияющее на нормальное выполнение программы, поскольку в Pythonвсе является объектом, поэтому исключение также является объектом, что означает ошибку; в нормальных условиях, даже если синтаксис Python правильный, при его запуске могут возникать ошибки, а ошибки, обнаруженные во время выполнения, называются исключениями.

Пример

>>> print(1 / 0)   # 0 不能作为除数,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> print(my_name)  # # my_name 未定义,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'my_name' is not defined
>>> print("5" + 5)  # # int 不能与 str 相加,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

Разные исключения вызывают разные сообщения об ошибках.В передней части сообщения об ошибке показан контекст, в котором произошло исключение, а конкретная информация отображается в виде стека вызовов.

Все распространенные сообщения об ошибках разобраны в конце статьи.портал

Обработка исключений

Когда в скрипте Python возникает исключение, мы не успеваем его отловить и обработать, и программа прекратит выполнение. использовать в питонеtry/exceptОператоры могут быть очень хороши для обработки исключений.

образец кода

try:
    print(my_name)  # 没有定义my_nama变量,就会发生异常
    print("我是正常执行的结果")  # 如果程序正常就会执行此代码
except NameError:
    print("如果发生异常,就会执行我")  # 如果发生错误就会执行此段代码

Процесс реализации:

  1. Выполнить предложение try (оператор между ключевым словом try и ключевым словом кроме)
  2. Переменная не найдена, возникает ошибка NameError
  3. Тип исключения точно соответствует оператору, следующему за исключением, и будет выполнено соответствующее предложение исключения.

Примечание. Если исключение не соответствует ему, исключение все равно будет выдано.

Если вы хотите, чтобы предложение exclude могло обрабатывать несколько исключений одновременно, эти исключения будут заключены в круглые скобки в виде кортежа, например:

try:
    pass
except (RuntimeError, TypeError, NameError):
    pass

ОдинtryОператоры также могут содержать несколькоexceptпредложения для обработки различных конкретных исключений. Будет выполнена не более одной ветки.

Последнее предложение exclude может игнорировать имя исключения, которое будет использоваться в качестве подстановочного знака. в состоянии пройтиraiseгенерировать исключение

образец кода

while True:
    try:
        a = int(input("请输入被除数:"))
        b = int(input("请输入被除数:"))
        c = a / b
        print("结果为:", c)
        break  # 跳出循环
    except ValueError:
        print("输入的不是一个数字,请重新输入")
    except:
        print("未知异常")
        raise  # 如果不是ValueError,会打印上一条语句并抛出异常

Процесс реализации

try/except...else

try/exceptОператор также имеет необязательныйelseпункт, чтобы использовать этот пункт, он должен быть помещен во всеexceptпосле оговорки.

elseпункт будет вtryПредложение выполняется, когда не возникает исключения.

Процесс реализации

Образец кода:

while True:
    try:
        a = int(input("请输入被除数:"))
        b = int(input("请输入被除数:"))
    except ValueError:
        print("输入的不是一个数字,请重新输入")
    except ZeroDivisionError:
        print("被除数为0")
    else:
        c = a / b
        print("结果为:", c)
        print('计算完毕')
        break

Здесь есть небольшая проблема, если в операторе бесконечного циклаtryимеютbreakключевое слово, оно не будет выполнятьсяelseутверждение

Используйте предложение else вместо того, чтобы помещать все операторы вtryОговорка лучше, чтобы избежать некоторых неожиданностей, иexceptНеперехватываемое исключение.

оператор try-finally

try-finallyОператор выполняет окончательный код независимо от того, возникает ли исключение.

while True:
    try:
        a = int(input("请输入被除数:"))
        b = int(input("请输入被除数:"))
    except ValueError:
        print("输入的不是一个数字,请重新输入")
    except ZeroDivisionError:
        print("被除数为0")
    else:
        c = a / b
        print("结果为:", c)
        print('计算完毕')
        break
    finally:
        print("程序执行完毕")  # 这句话,无论异常是否发生都会执行

Выбросить исключение

Использование Pythonraiseоператор выдает указанное исключение

Грамматические структуры

raise [Exception [, args [, traceback]]]

Exceptionтип исключения (например,NameError) любое из стандартных исключений параметра

args является самостоятельным параметром исключения (необязательным).

tracebackargs объект исключения отслеживания (необязательно).

образец кода

x = int(input())  # 获取一个数字
if x == 0:
    # 如果等于0就抛出Exception异常 
    raise Exception('x等于0。')  # Exception: x等于0。

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

while True:
    try:
        a = int(input("请输入被除数:"))
        b = int(input("请输入被除数:"))
        if b == 0:
            raise ZeroDivisionError('被除数等于0。')
    except ValueError as e:  # 将异常信息传递给e
        print(e)  # 将异常信息打印出来
        print("输入的不是一个数字,请重新输入")
    except ZeroDivisionError:
        print("被除数为0")
    else:
        c = a / b
        print("结果为:", c)
        print('计算完毕')
        break
    finally:
        print("程序执行完毕")  # 这句话,无论异常是否发生都会执行

dxcept...as...Информация об исключении может быть передана

Пользовательское исключение

Вы можете иметь свои собственные исключения, создав новый класс исключений. Класс исключения наследуется от класса исключения, который может быть унаследован прямо или косвенно.

образец кода

# 自定义一个异常类
class MyError(Exception):  # 异常类继承自 Exception 类
    """
    自己定义的一个异常类
    """

    def __init__(self, message):
        self.message = message


raise MyError("自己定义的一个异常类")