Python Исключения: Введение
Программа Python завершает работу, как только обнаруживает ошибку. В Python ошибка может быть синтаксической ошибкой или исключением. В этой статье вы увидите, что такое исключение и чем оно отличается от синтаксической ошибки. После этого вы узнаете о повышении исключений и утверждениях. Затем вы закончите с демонстрацией блока try and кроме.
Бесплатная загрузка PDF: Шпаргалка по Python 3
Исключения и ошибки синтаксиса
Синтаксические ошибки возникают, когда анализатор обнаруживает неверный оператор. Посмотрите на следующий пример:
>>> print( 0 / 0 ))
File "", line 1
print( 0 / 0 ))
^
SyntaxError: invalid syntax
Стрелка указывает, где парсер обнаружилsyntax error. В этом примере было слишком много скобок. Удалите его и снова запустите ваш код:
>>> print( 0 / 0)
Traceback (most recent call last):
File "", line 1, in
ZeroDivisionError: integer division or modulo by zero
На этот раз вы столкнулись сexception error. Этот тип ошибки возникает всякий раз, когда синтаксически правильный код Python приводит к ошибке. В последней строке сообщения указывался тип ошибки, с которой вы столкнулись.
Вместо того, чтобы показывать сообщениеexception error
, Python детализирует тип ошибки исключения. В данном случае это былZeroDivisionError
. Python поставляется сvarious built-in exceptions, а также с возможностью создавать самоопределяемые исключения.
Возникновение исключения
Мы можем использоватьraise
, чтобы генерировать исключение при возникновении условия. Оператор может быть дополнен пользовательским исключением.
Если вы хотите выдать ошибку при возникновении определенного условия с использованиемraise
, вы можете сделать это следующим образом:
x = 10
if x > 5:
raise Exception('x should not exceed 5. The value of x was: {}'.format(x))
Когда вы запустите этот код, результат будет следующим:
Traceback (most recent call last):
File "", line 4, in
Exception: x should not exceed 5. The value of x was: 10
Программа останавливается и выводит наше исключение на экран, предлагая подсказки о том, что пошло не так.
ИсключениеAssertionError
Вместо того, чтобы ждать, пока программа выйдет из строя на полпути, вы также можете начать сmaking an assertion in Python. Мыassert
, что определенное условие выполнено. Если это условие оказываетсяTrue
, то это отлично! Программа может продолжаться. Если условие оказываетсяFalse
, вы можете заставить программу выдать исключениеAssertionError
.
Посмотрите на следующий пример, где утверждается, что код будет выполняться в системе Linux:
import sys
assert ('linux' in sys.platform), "This code runs on Linux only."
Если вы запускаете этот код на компьютере с Linux, утверждение проходит. Если бы вы запускали этот код на машине с Windows, результатом утверждения было быFalse
, и результат был бы следующим:
Traceback (most recent call last):
File "", line 2, in
AssertionError: This code runs on Linux only.
В этом примере выброс исключенияAssertionError
- последнее, что программа сделает. Программа остановится и не будет продолжаться. Что если это не то, что вы хотите?
Блокtry
иexcept
: обработка исключений
Блокtry
иexcept
в Python используется для перехвата и обработки исключений. Python выполняет код, следующий за операторомtry
, как «нормальную» часть программы. Код, следующий за операторомexcept
, является ответом программы на любые исключения в предыдущем предложенииtry
.
Как вы видели ранее, когда синтаксически правильный код сталкивается с ошибкой, Python выдаст ошибку исключения. Эта ошибка исключения приведет к падению программы, если она не обработана. Предложениеexcept
определяет, как ваша программа реагирует на исключения.
Следующая функция может помочь вам понять блокиtry
иexcept
:
def linux_interaction():
assert ('linux' in sys.platform), "Function can only run on Linux systems."
print('Doing something.')
linux_interaction()
может работать только в системе Linux. assert
в этой функции вызовет исключениеAssertionError
, если вы вызовете его в операционной системе, отличной от Linux.
Вы можете присвоить функцииtry
, используя следующий код:
try:
linux_interaction()
except:
pass
Здесь вы обработали ошибку, выдавpass
. Если бы вы запустили этот код на компьютере с Windows, вы бы получили следующий вывод:
У тебя ничего нет. Хорошо, что программа не вылетала. Но было бы неплохо увидеть, возникает ли какое-то исключение, когда вы запускаете свой код. С этой целью вы можете изменитьpass
на что-то, что будет генерировать информативное сообщение, например:
try:
linux_interaction()
except:
print('Linux function was not executed')
Выполните этот код на компьютере с Windows:
Linux function was not executed
Когда в программе, выполняющей эту функцию, возникает исключение, программа продолжит работу и сообщит вам о том, что вызов функции не был успешным.
То, что вы не увидели, был тип ошибки, которая была выдана в результате вызова функции. Чтобы точно увидеть, что пошло не так, вам нужно отловить ошибку, которую выдает функция.
Следующий код является примером, в котором вы фиксируетеAssertionError
и выводите это сообщение на экран:
try:
linux_interaction()
except AssertionError as error:
print(error)
print('The linux_interaction() function was not executed')
Запуск этой функции на компьютере с Windows выдает следующее:
Function can only run on Linux systems.
The linux_interaction() function was not executed
Первое сообщение - этоAssertionError
, информирующее вас о том, что функция может быть выполнена только на машине Linux. Второе сообщение говорит вам, какая функция не была выполнена.
В предыдущем примере вы вызвали функцию, которую написали сами. При выполнении функции вы поймали исключениеAssertionError
и распечатали его на экране.
Вот еще один пример, где вы открываете файл и используете встроенное исключение:
try:
with open('file.log') as file:
read_data = file.read()
except:
print('Could not open file.log')
Еслиfile.log не существует, этот блок кода выдаст следующее:
Could not open file.log
Это информативное сообщение, и наша программа будет продолжать работать. ВPython docs вы можете видеть, что есть много встроенных исключений, которые вы можете здесь использовать. На этой странице описано следующее исключение:
Исключение
FileNotFoundError
Возникает, когда файл или каталог запрашивается, но не существует. Соответствует errno ENOENT.
Чтобы перехватить этот тип исключения и вывести его на экран, вы можете использовать следующий код:
try:
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
В этом случае, еслиfile.log не существует, вывод будет следующим:
[Errno 2] No such file or directory: 'file.log'
Вы можете иметь более одного вызова функции в предложенииtry
и ожидать обнаружения различных исключений. Здесь следует отметить, что код в предложенииtry
остановится, как только возникнет исключение.
Warning: ПерехватException
скрывает все ошибки… даже совершенно неожиданные. Вот почему вам следует избегать голых предложенийexcept
в ваших программах Python. Вместо этого вы захотите обратиться кspecific exception classes, которое вы хотите поймать и обработать. Вы можете узнать больше о том, почему это хорошая идеяin this tutorial.
Посмотрите на следующий код. Здесь вы сначала вызываете функциюlinux_interaction()
, а затем пытаетесь открыть файл:
try:
linux_interaction()
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
except AssertionError as error:
print(error)
print('Linux linux_interaction() function was not executed')
Если файл не существует, выполнение этого кода на компьютере с Windows приведет к следующему:
Function can only run on Linux systems.
Linux linux_interaction() function was not executed
Внутри предложенияtry
вы сразу же столкнулись с исключением и не дошли до той части, где пытаетесь открытьfile.log. Теперь посмотрим, что происходит, когда вы запускаете код на Linux-машине:
[Errno 2] No such file or directory: 'file.log'
Вот ключевые выводы:
-
Предложение
try
выполняется до момента, когда встречается первое исключение. -
Внутри предложения
except
или обработчика исключения вы определяете, как программа реагирует на исключение. -
Вы можете предвидеть множество исключений и различать, как программа должна реагировать на них.
Пунктelse
В Python с помощью оператораelse
вы можете указать программе выполнить определенный блок кода только при отсутствии исключений.
Посмотрите на следующий пример:
try:
linux_interaction()
except AssertionError as error:
print(error)
else:
print('Executing the else clause.')
Если вы запустите этот код в системе Linux, вы получите следующий результат:
Doing something.
Executing the else clause.
Поскольку программа не вызвала никаких исключений, было выполнено предложениеelse
.
Вы также можетеtry
запускать код внутри предложенияelse
и также улавливать возможные исключения там:
try:
linux_interaction()
except AssertionError as error:
print(error)
else:
try:
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
Если бы вы выполнили этот код на машине Linux, вы бы получили следующий результат:
Doing something.
[Errno 2] No such file or directory: 'file.log'
Из выходных данных видно, что функцияlinux_interaction()
была запущена. Поскольку никаких исключений не обнаружено, была сделана попытка открытьfile.log. Этот файл не существует, и вместо его открытия вы поймали исключениеFileNotFoundError
.
Очистка после использованияfinally
Представьте, что вам всегда приходилось реализовывать какие-то действия для очистки после выполнения вашего кода. Python позволяет сделать это с помощью предложенияfinally
.
Посмотрите на следующий пример:
try:
linux_interaction()
except AssertionError as error:
print(error)
else:
try:
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
finally:
print('Cleaning up, irrespective of any exceptions.')
В предыдущем коде будет выполнено все, что указано в предложенииfinally
. Не имеет значения, встретите ли вы исключение где-нибудь в предложенияхtry
илиelse
. Запуск предыдущего кода на компьютере с Windows вывел бы следующее:
Function can only run on Linux systems.
Cleaning up, irrespective of any exceptions.
Подводя итоги
Увидев разницу между синтаксическими ошибками и исключениями, вы узнали о различных способах вызывать, обрабатывать и обрабатывать исключения в Python. В этой статье вы увидели следующие параметры:
-
raise
позволяет вам в любой момент вызвать исключение. -
assert
позволяет вам проверить, выполняется ли определенное условие, и выдать исключение, если это не так. -
В предложении
try
все операторы выполняются до тех пор, пока не будет обнаружено исключение. -
except
используется для перехвата и обработки исключений, которые встречаются в предложении try. -
else
позволяет вам кодировать разделы, которые должны выполняться, только если в предложении try не встречаются исключения. -
finally
позволяет вам выполнять разделы кода, которые должны всегда выполняться, с любыми ранее встреченными исключениями или без них.
Бесплатная загрузка PDF: Шпаргалка по Python 3
Надеемся, что эта статья помогла вам понять основные инструменты, которые Python может предложить при работе с исключениями.