Ошибки и исключения
Если вы пишете программу на 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