Ошибки и исключения

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

my_string = "Привет, мир.
Traceback (most recent call last):
  File error.py, line 1
    my_string = "Привет, мир.
                             ^
SyntaxError: EOL while scanning string literal

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

Сообщение расскажет вам о том, в каком файле была ошибка, в какой она произошла строке, и что это была за ошибка. Хотя ошибки могут показаться пугающими, они случаются постоянно.

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

У Python есть два типа ошибок: синтаксические ошибки и исключения. Исключением называется любая ошибка, которая не является синтаксической. В отличие от синтаксических ошибок, исключения необязательно фатальны.

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

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

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

Предположим, вы написали программу, которая принимает от пользователя два числа и выводит результат деления первого числа на второе:

a = input("Введите число: ")
b = input("Введите еще одно число: ")
a = int(a)
b = int(b)
print (a / b)

Программа будет работать. Однако если пользователь введет 0 в качестве второго числа, вы столкнетесь с ошибкой:

Traceback (most recent call last):
  module division.py line 5
ZeroDivisionError: division by zero

Нельзя просто надеяться, что пользователь не введет 0 и отличным способом выйти из положения может стать обработка исключений — инструмент, позволяющий «перехватить» исключения, если таковые возникают, и решить, что делать дальше.

Для обработки исключений используются ключевые слова try и except. При использовании обработки исключений, когда пользователь вторым числом вводит 0, программа может вывести им сообщение о недопустимости ввода нуля.

Все исключения в Python являются объектами, так что вы можете использовать их в своих программах. Список встроенных исключений можно найти здесь. Если вам кажется, что ваш код может сгенерировать исключение, используйте составную инструкцию с ключевыми словами try и except, чтобы перехватить его.

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

try:
    a = input("Введите число: ")
    b = input("Введите еще одно число: ")
    a = int(a)
    b = int(b)
    print (a / b)
except ZeroDivisionError:
    print("b не может быть нулем!")

Такая программа перехватит исключение ZeroDivisionError и передаст управление в блок except, в котором мы и выведем сообщение о недопустимости ввода 0.

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

Traceback (most recent call last):
  module division.py line 3
ValueError: invalid literal for int() with base 10: 'слово'

Это можно исправить, перехватив оба типа исключений

try:
    a = input("Введите число: ")
    b = input("Введите еще одно число: ")
    a = int(a)
    b = int(b)
    print (a / b)
except ZeroDivisionError:
    print("b не может быть нулем!")
except ValueError:
    print("Ошибка ввода числа")

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

try:
    10 / 0
    c = "Я никогда не определюсь."
except ZeroDivisionError:
    print(c)

Такая программа закончится с ошибкой

Traceback (most recent call last):
  module zero.py line 5
NameError: name 'c' is not defined