Python Исключения: Введение

Python Исключения: Введение

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

An introduction to exceptions in Python

Бесплатная загрузка 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, чтобы генерировать исключение при возникновении условия. Оператор может быть дополнен пользовательским исключением.

Illustration of raise statement usage

Если вы хотите выдать ошибку при возникновении определенного условия с использованием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.

Python assert statement

Посмотрите на следующий пример, где утверждается, что код будет выполняться в системе 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.

Diagram showing try and except statements

Как вы видели ранее, когда синтаксически правильный код сталкивается с ошибкой, 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 или обработчика исключения вы определяете, как программа реагирует на исключение.

  • Вы можете предвидеть множество исключений и различать, как программа должна реагировать на них.

  • Избегайте использования простых предложенийexcept.

Пунктelse

В Python с помощью оператораelse вы можете указать программе выполнить определенный блок кода только при отсутствии исключений.

Diagram of try

Посмотрите на следующий пример:

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.

Diagram explaining try except else finally statements

Посмотрите на следующий пример:

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 может предложить при работе с исключениями.