Обрабатываем исключения в python: try и except

Табуляция и разрыв строк в Python.

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

В таблице приведены наиболее часто встречаемые комбинации символов.

Символы табуляции в Python

Последовательность символов

          Описание            
\t Вставляет символ горизонтальной табуляции
\n Вставляет в строку символ новой строки
\\ Вставляет символ обратного слеша
Вставляет символ двойной кавычки
\’ Вставляет символ одиночной кавычки

Для добавления в текст табуляции используется комбинация символов \t. Разрыв строки добавляется с помощью комбинации символов \n. 

>>> print(«Python»)Python
>>> print(«\tPython»)
        Python
>>> print(«Языки программирования:\nPython\nJava\nC»)Языки программирования:
Python
Java
C

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

>>> print(«Языки программирования:\n\tPython\n\tJava\n\tC»)Языки программирования:
        Python
        Java
        C

Синтаксис конструкции try и except

Для начала разберем синтаксис операторов try и except в Python. Общий шаблон представлен ниже:

try:
	# В этом блоке могут быть ошибки
    
except <error type>:
	# Сделай это для обработки исключения;
	# выполняется, если блок try выбрасывает ошибку
    
else:
	# Сделай это, если блок try выполняется успешно, без ошибок
   
finally:
	# Этот блок выполняется всегда

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

Блок try

Блок — это блок кода, который вы хотите попробовать выполнить. Однако во время выполнения из-за какого-нибудь исключения могут возникнуть ошибки. Поэтому этот блок может не работать должным образом.

Блок except

Блок запускается, когда блок не срабатывает из-за исключения. Инструкции в этом блоке часто дают некоторый контекст того, что пошло не так внутри блока .

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

можно использовать и без указания типа ошибки. Но лучше так не делать. При таком подходе не учитывается, что возникающие ошибки могут быть разных типов. То есть вы будете знать, что что-то пошло не так, но что именно произошло, какая была ошибка — вам будет не известно.

При попытке выполнить код внутри блока также существует вероятность возникновения нескольких ошибок.

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

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

Блок else

Блок запускается только в том случае, если блок выполняется без ошибок. Это может быть полезно, когда нужно выполнить ещё какие-то действия после успешного выполнения блока . Например, после успешного открытия файла вы можете прочитать его содержимое.

Блок finally

Блок выполняется всегда, независимо от того, что происходит в других блоках. Это полезно, когда вы хотите освободить ресурсы после выполнения определенного блока кода.

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

Марк Лутц «Изучаем Python»

Скачивайте книгу у нас в телеграм

Скачать

×

Итак, теперь давайте используем полученные знания для обработки исключений в Python. Приступим!

Как пропустить ошибки и продолжить выполнение кода

Лучше не применять данную практику. Но если это нужно, то используйте следующий пример.

try:
    assert False
except AssertionError:
    pass
print('Welcome to Prometheus!!!')

Вывод:

Welcome to Prometheus!!!

Рассмотрим наиболее распространенные исключения в Python с примерами.

Распространенные ошибки исключений:

  • IOError–возникает, если файл не открывается.
  • ImportError — если модуль python не может быть загружен или размещен.
  • ValueError — возникает, если функция получает аргумент корректного типа, но с некорректным значением.
  • KeyboardInterrupt — когда пользователь прерывает выполнение кода нажатием на Delили Ctrl-C.
  • EOFError — когда функции input() / raw_input()достигают конца файла (EOF), но без чтения каких-либо данных.

Примеры распространенных исключений

except IOError:
print('Error occurred while opening the file.')

except ValueError:
print('Non-numeric input detected.')

except ImportError:
print('Unable to locate the module.')

except EOFError:
print('Identified EOF error.')

except KeyboardInterrupt:
print('Wrong keyboard input.')

except:
print('An error occurred.')

Управление исключениями

В Пайтоне есть возможность создавать свои виды исключений. Ниже мы рассмотрим как это делать, а ещё такую важную вещь как логгирование.

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

В Python есть ключевое слово raise. Нужно оно для того чтоб самостоятельно вызывать исключения:

Копировать

Такие ошибки тоже можно ловить в try и обрабатывать в except:

Копировать

Для того чтобы создать свой тип исключения, необходимо объявить новый класс и унаследовать его от базового типа Exception. Текст ошибки можно передавать используя дандер метод __str__:

Копировать

Так же, текст ошибки можно передавать переопределяя родительский атрибут message:

Копировать

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

Копировать

Запись в лог

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

Копировать

Параметр level= указывает, сообщения какого уровня заносить в лог. К примеру, если указать ‘level= logging.ERROR’, то логгироваться будут только сообщения уровня error и critical. Объединим логгирование и обработку исключений:

Копировать

Зачем конечный список Python с Training Comma?

Мы видели много примеров многострочных конструкций, где после последнего списка появляется трейлинг-запятая:

# PEP 8 Compliant
age = {
    'Alice': 24,
    'Bob': 28,
    'Ann': 26,
    }

Трейлинг запятая после последней строки в словаре ( ) это по желанию Согласно Отказ

Знать: Вы найдете много мнения в Интернете, где «эксперты» скажут вам, что требуется трейлинг запятой ( как здесь ). Но это явно не указано в стандарте. На самом деле, стандарт рекомендует использовать запятую, если ваш «Предметы , как ожидается, будет продлеваться с течением времени» ( ). В этом случае легче скопировать и вставлять новые элементы в список (или словарь), без необходимости вручную добавить трейлинг запятую к старому последнему элементу и удаляя заднюю запятую после нового последнего элемента.

Другими словами, следующая многострочная конструкция также действительна и неявно следует стандарту PEP 8:

# PEP 8 Compliant
age = {
    'Alice': 24,
    'Bob': 28,
    'Ann': 26
    }

Обратите внимание, что конечная запятая отсутствует. Но если вы не планируете продлить список с течением времени, нормально использовать это – даже если некоторые Стиль Python Code Checkers («ЛИНТЕРЫ») жалуются

Запуск отладчика PDB (Python Debugger) при падении тестов¶

содержит встроенный отладчик PDB (Python Debugger). позволяет
запустить отладчик с помощью параметра командной строки:

pytest --pdb

Использование параметра позволяет запускать отладчик при каждом падении теста
(или прерывании его с клавиатуры). Часто хочется сделать это для первого же упавшего теста,
чтобы понять причину его падения:

pytest -x --pdb   # вызывает отладчик при первом падении и завершает тестовую сессию
pytest --pdb --maxfail=3  # вызывает отладчик для первых трех падений

Обратите внимание, что при любом падении информация об исключении сохраняется в
, и. При интерактивном использовании
это позволяет перейти к отладке после падения с помощью любого инструмента отладки.
Можно также вручную получить доступ к информации об исключениях, например:

Как создать свой тип Exception

В Python можно создавать свои исключения. При этом есть одно обязательное условие: они должны быть потомками класса

С помощью контролируются и обрабатываются ошибки в приложении. Это особенно актуально для критически важных частей программы, где любые «падения» недопустимы (или могут привести к негативным последствиям). Например, если программа работает как «демон», падение приведет к полной остановке её работы. Или, например, при временном сбое соединения с базой данных, программа также прервёт своё выполнения (хотя можно было отловить ошибку и попробовать соединиться в БД заново).

Вместе с можно использовать дополнительные блоки. Если использовать все блоки описанные в статье, то код будет выглядеть так:

Подробнее о работе с исключениями в Python можно ознакомиться в официальной документации.

Что такое исключения

Работа программиста во многом связана с возникающими в коде ошибками. Их приходится находить и исправлять. Особенно опасны так называемые гейзенбаги – ошибки, которые сложно воспроизвести. Так же существуют скрытые ошибки, их ещё можно назвать логическими. Ещё есть ошибки, которые и вовсе не зависят от программы. Представьте, у Вас есть программа-скрапер, которая автоматически скачивает картинки из соцсети. Заходит она на очередную страницу… А сервер сети поломался. Программа выдаст ошибку.

Если говорить именно о Питоне, то сложность ещё и в том, что это не компилируемый, а интерпретируемый язык, то есть код выполняется «на лету», строка за строкой. Это означает, что у Пайтон-программиста нет возможности отловить ошибки на этапе компиляции. Ещё одна сложность заключается в том, что Python – язык со строгой, но динамической типизацией. Частично это решается в последних версиях языка средством под названием «аннотирование типов», но полностью проблемы не устраняет.

И так, существуют следующие виды ошибок:

  • Синтаксические – когда программист нарушает правила самого языка, к примеру, допускает опечатку в ключевом слове;
  • Логические – когда в коде используется не верная логика;
  • Ввода – когда программист предполагал от пользователя ввода одних данных, а введены другие. К примеру, создатель сайта задумывал, что число в форме будет указано с использованием точки в качестве разделителя, а пользователь ввёл «3,14». Именно этот вид ошибок – излюбленная лазейка хакеров.

Синтаксические ошибки – самые простые, поскольку интерпретатор сам сообщит Вам о них при попытке запустить скрипт.

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

Копировать

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

Копировать

В этом примере программист хотел сделать сортировку пузырьком, но допустил ошибку. А Вы сможете её найти?

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

Копировать

Как вы видите, интерпретатор «выбрасывает» исключение «ValueError» — ошибка значения и останавливает выполнение кода.

Как устроен механизм исключений

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

Пример: напишем скрипт, в котором функция ожидает число, а мы передаём сроку (это вызовет исключение «TypeError»):

В данном примере мы запускаем файл «test.py» (через консоль). Вызывается функция «a», внутри которой вызывается функция «b». Все работает хорошо до сточки . Тут интерпретатор понимает, что нельзя конкатенировать строку с числом, останавливает выполнение программы и вызывает исключение «TypeError».

Далее ошибка передается по цепочке в обратном направлении: «b» → «a» → «test.py». Так как в данном примере мы не позаботились обработать эту ошибку, вся информация по ошибке отобразится в консоли в виде Traceback.

Traceback (трассировка) — это отчёт, содержащий вызовы функций, выполненные в определенный момент. Трассировка помогает узнать, что пошло не так и в каком месте это произошло.

Пример Traceback в Python

В нашем примере содержится следующую информацию (читаем снизу вверх):

  1. — тип ошибки (означает, что операция не может быть выполнена с переменной этого типа);
  2. — подробное описание ошибки (конкатенировать можно только строку со строкой);
  3. Стек вызова функций (1-я линия — место, 2-я линия — код). В нашем примере видно, что в файле «test.py» на 11-й линии был вызов функции «a» со строковым аргументом «10». Далее был вызов функции «b». это последнее, что было выполнено — тут и произошла ошибка.
  4. — означает, что самый последний вызов будет отображаться последним в стеке (в нашем примере последним выполнился ).

В Python ошибку можно перехватить, обработать, и продолжить выполнение программы — для этого используется конструкция .

F-строки. Форматирование строк в Python.

Часто требуется использовать значения переменных внутри строки. Предположим, что у вас имя и фамилия хранятся в разных переменных и вы хотите их объединить для вывода полного имени. 

name = «Александр»

surname = «Пушкин»

Для того чтобы вставить значение переменных в строку, нужно поставить букву f непосредственно перед открывающейся кавычкой. Заключить имя или имена переменных в фигурные скобки {}. 

full_name = f»{name} {surname}»

Python заменить каждую переменную на ее  значение при выводе строки.

>>> name = «Александр»
>>> surname = «Пушкин»
>>> full_name = f»{name} {surname}»
>>> print(full_name)Александр Пушкин  

Буква f происходит от слова format, потому что Python форматирует строку, заменяя имена переменных в фигурных скобках на их значения. В итоге выводится строка имя и фамилия.

Если в переменной имя и фамилия записана с маленькой буквы, то на помощь придет метод . Так же с помощью f строк можно строить сообщения, которые затем сохраняются в переменной. 

>>> name = «александр»
>>> surname = «пушкин»
>>> full_name = f»{name} {surname}»
>>> print(f»Русский поэт {full_name.title()}!»)Русский поэт Александр Пушкин!
>>> message = f»Мой любимый поэт {name.title()} {surname.title()}»
>>> print(message)Мой любимый поэт Александр Пушкин

Важно: F-строки впервые появились в Python3.6. Если вы используете более раннею версию, используйте метод format

Что бы использовать метод format(), перечислите переменные в круглых скобках после format.

full_name = «{} {}».format(name, surname)

Python exit с помощью quit()

Эта функция работает точно так же, как exit(). Нет никакой разницы. Это делается для того, чтобы сделать язык более удобным для пользователя. Только подумай, ты же href=”https://en.wikipedia.org/wiki/Programmer”>новичок в языке python, какая функция, по вашему мнению, должна использоваться для выхода из программы? Выходите или уходите, верно? Это то, что делает Python простым в использовании языком. Как и функция python exit, функция python quit() не оставляет следов стека и не должна использоваться в реальной жизни. href=”https://en.wikipedia.org/wiki/Programmer”>новичок в языке python, какая функция, по вашему мнению, должна использоваться для выхода из программы? Выходите или уходите, верно? Это то, что делает Python простым в использовании языком. Как и функция python exit, функция python quit() не оставляет следов стека и не должна использоваться в реальной жизни.

Предположим, мы хотим выйти из программы, когда встречаем имя в списке меток-

marks= 
for i in marks: 
   if type(i) : 
        print("Oops!! Encountered a non-int value:",i) 
        quit()
Output- 
Oops!! Encountered a non-int value: ashwini

Ошибка «Не распознается как внутренняя или внешняя команда» вызывает:

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

1. Исполняемый файл или скрипт не установлены

Возможно, программа, которую вы хотите запустить из командной строки, неправильно установлена ​​в вашей системе. Наиболее частой причиной этого является поврежденный установщик. Либо этот, либо установленный исполняемый файл не находится в каталоге, в котором его ищет командный интерфейс.

2. Имя файла и путь указаны неверно.

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

Если вы получаете сообщение об ошибке, важно проверять свой командный символ за символом, чтобы убедиться, что он указан правильно. Другая возможность заключается в том, что каталог файла, который вы пытаетесь выполнить, не существует в переменных среды Windows

Серия каталогов, известная как «Путь», находится в разделе «Системные переменные» в переменных среды Windows и требуется для выполнения команд. Здесь также должен находиться ваш файловый каталог, особенно если вы не указываете полный путь к вашему файлу в командной строке

Другая возможность заключается в том, что каталог файла, который вы пытаетесь выполнить, не существует в переменных среды Windows. Серия каталогов, известная как «Путь», находится в разделе «Системные переменные» в переменных среды Windows и требуется для выполнения команд. Здесь также должен находиться ваш файловый каталог, особенно если вы не указываете полный путь к вашему файлу в командной строке.

Но некоторые программы, вирусы и вредоносные программы могут изменять эти переменные среды. Если это произойдет, командная строка не сможет распознать команды или выполнить их.

4. Исполняемые файлы в system32 не найдены в 64-битной Windows

Для тех, кто использует 64-битную Windows, может быть другая потенциальная причина ошибки.

Для 64-разрядных программ Windows используется каталог «C: Windows System32», а для 32-разрядных программ — «C: Windows SysWOW64».

Хотя большинство исполняемых файлов находится в обоих этих каталогах, некоторые из них существуют только в System32, и лишь некоторые из них — в SysWOW64.

По умолчанию «Путь» переменных среды Windows содержит папку C: Windows System32. Это означает, что при работе в 64-разрядной среде командная строка ищет каталог пути в C: Windows System32. Поэтому, если вы хотите запускать 32-битные программы, вы должны выполнять их в 32-битной среде.

Интерактивный режим

Изначально программа запускается в интерактивном режиме. По другому его называют REPL. Все что вы напишете в интерактивном режиме после «>>>» будет сразу же выполнено построчно. Традиционный «Hello world!» будет выглядеть так:

Первая программа в IDLE – вывод фразы «Hello world!».

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

Подсветка синтаксиса

Прежде всего подсветка синтаксиса упрощает жизнь программиста. Чтение и написание кода становится более удобным — каждая конструкция языка подсвечивается определенным цветом. Комментарии красным, строки зеленым, вывод синим и т.д.

Подсветка синтаксиса в Python IDLE.

Отступы

Отступы в IDLE создаются автоматически. По умолчанию их размер равен 8-ми пробелам.

В REPL режиме команды исполняются построчно, однако IDLE понимает, что для некоторых инструкций (if-else, while и т.д.) необходим многострочный ввод. Когда вы ввели первую строку, например и нажали «enter», IDLE перенесет курсор на новую строку и автоматически создаст новый отступ.

IDLE автоматически создает отступы для многострочных инструкций.

Небольшая инструкция по работе с отступами:

  • при нажатии на «enter» в нужных конструкциях, отступы создаются автоматически;
  • если вам необходимо сдвинуться на предыдущий уровень, нажмите «Backspace» или стрелку «Влево»;
  • если необходимо сдвинуться вправо, нажмите «Tab» или стрелку «Вправо»;
  • если вы напечатали выражение pass, return, break, continue или raise и нажали «enter», каретка автоматически вернется к прежнему отступу.

Autocomplete

Механизм автозавершения фраз и конструкций используется во многих IDE, и Python IDLE не исключение. Если вы будете пользоваться этой функцией, скорость написание вашего кода заметно ускорится, так как не придется дописывать названия переменных и конструкций полностью. Достаточно ввести часть слова (например ) и нажать . Если вариантов слова несколько, нажмите данную комбинацию несколько раз.

Подсказки к функциям

При вызове функции или метода, после открывающейся скобки (где далее будут прописаны аргументы) IDLE отобразит подсказку. В ней будут описаны аргументы, которые ожидает функция.

Подсказки для функций в IDLE Python.

Подсказка будет отображаться до тех пор, пока вы не закроете скобку.

История команд

Чтобы полистать историю введенных ранее команд, установите курсор после «>>>» и выполните комбинацию (листать вперед) или (листать назад).

Если же вы нашли команду в окне и хотите ее скопировать, поставиться курсор в конец этой команды и нажмите «enter».

Улучшения в сообщении об ошибке AttributeErrors.

При печати исключения , функция интерпретатора предложит варианты похожих имен атрибутов в объекте, из которого возникло исключение:

>>> collections.namedtoplo
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# AttributeError: module 'collections' has no attribute 'namedtoplo'. 
# Did you mean: namedtuple?

Предупреждение

Обратите внимание, что это не сработает, если для отображения ошибки не вызывается `PyErr_Display(). Это может произойти при использовании какой-либо другой пользовательской функции отображения ошибок

Например, это распространенный сценарий в IPython.

Изменение регистра символов в строках в Python.

Одной из частых операций, выполняемых со строками — это изменение регистра символов. Например, у нас есть переменная name, в которой сохранена строка «Hello world!». Для преобразования символов к верхнему или нижнему регистру существует несколько методов.

>>> name = «Hello world!»
>>> print(name.title())Hello World!
>>> print(name.upper())HELLO WORLD!
>>> print(name.lower())hello world!

В первом случае за именем переменной в команде print() следует вызов метода title(). Метод — это действие, которое Python выполняет с данными. Точка после name приказывает Python применить метод title() к переменной name. За именем метода всегда следует пара круглых скобок (). Методам для выполнения их работы часто требуется дополнительные данные, и они указываются в скобках. В данный момент дополнительная информация не нужна, поэтому в скобках ничего нет. Метод title() преобразует первый символ каждого слова к верхнему регистру, остальные символы выводятся, как и были. Во втором случае используется метод upper(), в котором все символы преобразовываются к верхнему регистру. В третьем случае в методе lower() идет преобразование всех символов к нижнему регистру.

Метод lower() очень часто используется для хранения данных. Редко при вводе данных все пользователи вводят данные с точным соблюдением регистра. После ввода все данные преобразуются к нижнему регистру и уже затем выводится информация с использованием регистра, наиболее подходящего.

Куда пойти отсюда?

Достаточно теории, давайте познакомимся!

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

Практические проекты – это то, как вы обостряете вашу пилу в кодировке!

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

Затем станьте питоном независимым разработчиком! Это лучший способ приближения к задаче улучшения ваших навыков Python – даже если вы являетесь полным новичком.

Присоединяйтесь к моему бесплатным вебинаре «Как создать свой навык высокого дохода Python» и посмотреть, как я вырос на моем кодированном бизнесе в Интернете и как вы можете, слишком от комфорта вашего собственного дома.

Присоединяйтесь к свободному вебинару сейчас!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

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

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: