До сих пор сообщения об ошибках не были более чем упомянуты, но если вы пробовали примеры, вы, вероятно, видели некоторые из них. Есть (по крайней мере) два различных вида ошибок: синтаксические ошибки и исключения .
8.1.Ошибки синтаксиса
Синтаксические ошибки,также известные как ошибки синтаксического анализа,являются,пожалуй,самым распространенным видом жалоб,которые вы получаете в процессе изучения Python:
>>> while True print(‘Hello world’) File «», line 1 while True print(‘Hello world’) ^ SyntaxError: invalid syntax
Анализатор повторяет ошибочную строку и отображает небольшую «стрелку», указывающую на самую раннюю точку в строке, где была обнаружена ошибка. Ошибка вызвана (или, по крайней мере, обнаружена) токеном, предшествующим стрелке: в примере ошибка обнаружена в функции print() , поскольку перед ней отсутствует двоеточие ( ‘:’ ). Имя файла и номер строки печатаются, чтобы вы знали, где искать, если ввод поступил из скрипта.
8.2. Exceptions
Даже если оператор или выражение синтаксически верны, они могут вызвать ошибку при попытке их выполнить. Ошибки, обнаруженные во время выполнения, называются исключениями и не являются безоговорочно фатальными: вы скоро научитесь обрабатывать их в программах Python. Однако большинство исключений не обрабатываются программами и приводят к сообщениям об ошибках, как показано здесь:
Как исправить «Ошибка при выполнении приложения-сервера»
>>> 10 * (1/0) Traceback (most recent call last): File «», line 1, in module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File «», line 1, in module> NameError: name «спам» не определен >>> ‘2’ + 2 Traceback (most recent call last): File «», line 1, in module> TypeError: can only concatenate str (not «int») to str
Последняя строка сообщения об ошибке указывает, что произошло. Исключения бывают разных типов, и тип печатается как часть сообщения: типы в примере — ZeroDivisionError , NameError и TypeError . Строка, напечатанная как тип исключения, — это имя возникшего встроенного исключения. Это верно для всех встроенных исключений, но не обязательно для пользовательских исключений (хотя это полезное соглашение). Стандартные имена исключений — это встроенные идентификаторы (не зарезервированные ключевые слова).
Остальная часть строки содержит подробную информацию о типе исключения и о том,что его вызвало.
Предшествующая часть сообщения об ошибке показывает контекст,в котором произошло исключение,в виде трассировки стека.В общем случае он содержит трассировку стека с перечислением исходных строк;однако он не отображает строки,считанные со стандартного ввода.
Встроенные исключения перечисляет встроенные исключения и их значения.
8.3.Обработка исключений
Можно написать программы,которые обрабатывают выбранные исключения.Посмотрите на следующий пример,который запрашивает у пользователя ввод до тех пор,пока не будет введено действительное целое число,но позволяет пользователю прервать программу (используя Control — C или все, что поддерживает операционная система); обратите внимание, что пользовательское прерывание сигнализируется возбуждением исключения KeyboardInterrupt .
Установка Python под Windows. Устраняем ошибки.
>>> while True: . try: . x = int(input(«Please enter a number: «)) . break . except ValueError: . print(«Oops! That was no valid number. Try again. «) .
Оператор try работает следующим образом.
- Сначала выполняется предложение try (операторы между ключевыми словами try и except ).
- Если не возникает исключения, предложение except пропускается и выполнение оператора try завершается.
- try возникает исключение , остальная часть предложения пропускается. Затем, если его тип соответствует исключению, названному после ключевого слова except, выполняется exceptexcept , а затем выполнение продолжается после блока try / except.
- Если возникает исключение, которое не соответствует исключению, указанному в предложении except , оно передается во внешние операторы try ; если обработчик не найден, это необработанное исключение , и выполнение останавливается с сообщением, как показано выше.
У оператора try может быть более одного предложения except , чтобы указать обработчики для разных исключений. Будет выполнено не более одного обработчика. Обработчики обрабатывают только исключения, которые возникают в соответствующем предложении try , а не в других обработчиках того же оператора try . Предложение except может называть несколько исключений в виде кортежа в скобках, например:
. except (RuntimeError, TypeError, NameError): . pass
Класс в предложении except совместим с исключением, если это тот же класс или его базовый класс (но не наоборот — предложение исключения, перечисляющее производный класс, несовместимо с базовым классом). Например, следующий код напечатает B, C, D в указанном порядке:
class B(Exception): pass class C(B): pass class D(C): pass for cls in [B, C, D]: try: raise cls() except D: print(«D») except C: print(«C») except B: print(«B»)
Обратите внимание, что если бы предложения исключения были перевернуты (с первым except B ), он напечатал бы B, B, B — срабатывает первое подходящее предложение кроме .
Когда возникает исключение, оно может иметь связанные значения, также известные как аргументы исключения . Наличие и типы аргументов зависят от типа исключения.
Предложение exclude может указывать переменную после имени исключения. Переменная привязана к экземпляру исключения, который обычно имеет атрибут args , в котором хранятся аргументы. Для удобства встроенные типы исключений определяют __str__() для печати всех аргументов без явного доступа к .args .
>>> try: . raise Exception(‘spam’, ‘eggs’) . except Exception as inst: . print(type(inst)) # экземпляр исключения . print(inst.args) # аргументы хранятся в .args . print(inst) # __str__ позволяет напрямую выводить аргументы, . # но может быть переопределено в подклассах исключений . x, y = inst.args # распаковать аргументы . print(‘x =’, x) . print(‘y =’, y) . (‘spam’, ‘eggs’) (‘spam’, ‘eggs’) x = spam y = eggs
Вывод исключения __str__() печатается как последняя часть («подробности») сообщения для необработанных исключений.
BaseException — это общий базовый класс всех исключений. Один из его подклассов, Exception , является базовым классом всех нефатальных исключений. Исключения, которые не являются подклассами Exception , обычно не обрабатываются, поскольку они используются для указания того, что программа должна завершиться. Они включают SystemExit , который вызывается sys.exit() , и KeyboardInterrupt , который вызывается, когда пользователь хочет прервать программу.
Exception можно использовать как подстановочный знак, который перехватывает (почти) все. Однако хорошей практикой является максимально точное определение типов исключений, которые мы намерены обрабатывать, и разрешение распространения любых непредвиденных исключений.
Наиболее распространенный шаблон для обработки Exception заключается в том, чтобы распечатать или зарегистрировать исключение, а затем повторно вызвать его (позволяя вызывающему объекту также обрабатывать исключение):
import sys try: f = open(‘myfile.txt’) s = f.readline() i = int(s.strip()) except OSError as err: print(«OS error:», err) except ValueError: print(«Could not convert data to an integer.») except Exception as err: print(f»Unexpected , type(err)=>») raise
Оператор try … except имеет необязательное предложение else , которое, если оно присутствует, должно следовать за всеми предложениями кроме . Это полезно для кода, который должен быть выполнен, если предложение try не вызывает исключение. Например:
for arg in sys.argv[1:]: try: f = open(arg, ‘r’) except OSError: print(‘cannot open’, arg) else: print(arg, ‘has’, len(f.readlines()), ‘lines’) f.close()
Использование предложения else лучше, чем добавление дополнительного кода в предложение try , потому что оно позволяет избежать случайного перехвата исключения, которое не было вызвано кодом, защищенным оператором try … except .
Обработчики исключений обрабатывают не только исключения, возникающие непосредственно в предложении try , но и те, которые возникают внутри функций, вызываемых (даже косвенно) в предложении try . Например:
>>> def this_fails(): . x = 1/0 . >>> try: . this_fails() . except ZeroDivisionError as err: . print(‘Handling run-time error:’, err) . Handling run-time error: division by zero
8.4.Возбуждение исключений
Оператор raise позволяет программисту принудительно вызвать указанное исключение. Например:
>>> raise NameError(‘HiThere’) Traceback (most recent call last): File «», line 1, in module> NameError: HiThere
Единственный аргумент для raise указывает на возбуждаемое исключение. Это должен быть либо экземпляр исключения, либо класс исключения (класс, производный от BaseException , например Exception или один из его подклассов). Если передается класс исключения, он будет неявно создан путем вызова его конструктора без аргументов:
raise ValueError # сокращение для ‘поднять ValueError ()’
Если вам нужно определить, было ли вызвано исключение, но вы не собираетесь его обрабатывать, более простая форма оператора raise позволяет вам повторно вызвать исключение:
>>> try: . raise NameError(‘HiThere’) . except NameError: . print(‘An exception flew by!’) . raise . An exception flew by! Traceback (most recent call last): File «», line 2, in NameError: HiThere
8.5.Цепочка исключений
Если необработанное исключение возникает внутри раздела except , к нему будет привязано обрабатываемое исключение, которое будет включено в сообщение об ошибке:
>>> try: . open(«database.sqlite») . except OSError: . raise RuntimeError(«unable to handle error») . Traceback (most recent call last): File «», line 2, in FileNotFoundError: [Errno 2] No such file or directory: ‘database.sqlite’ During handling of the above exception, another exception occurred: Traceback (most recent call last): File «», line 4, in RuntimeError: unable to handle error
Чтобы указать, что исключение является прямым следствием другого, оператор raise допускает необязательный пункт from :
# exc должно быть экземпляром исключения или None. raise RuntimeError from exc
Это может быть полезно при преобразовании исключений.Например:
>>> def func(): . raise ConnectionError . >>> try: . func() . except ConnectionError as exc: . raise RuntimeError(‘Failed to open database’) from exc . Traceback (most recent call last): File «», line 2, in File «», line 2, in func ConnectionError The above exception was the direct cause of the following exception: Traceback (most recent call last): File «», line 4, in RuntimeError: Failed to open database
Это также позволяет отключить автоматическую цепочку исключений с помощью идиомы from None :
>>> try: . open(‘database.sqlite’) . except OSError: . raise RuntimeError from None . Traceback (most recent call last): File «», line 4, in RuntimeError
Дополнительные сведения о механике цепочки см. В разделе Встроенные исключения .
Python 3.11
Data Structures
В этой главе более подробно описаны некоторые вещи,о которых вы уже узнали,а также добавлены новые.
Python также включает тип данных для наборов.
8.6.Определяемые пользователем исключения
Программы могут называть свои собственные исключения, создавая новый класс (дополнительную информацию о Python см. в разделе Классы). Можно определить классы исключений, которые делают что-либо другое.
Арифметика с плавающей запятой:проблемы и ограничения
Числа с плавающей точкой представляются компьютерной техникой в виде дробей по основанию 2 (двоичных).
Источник: runebook.dev
Ошибки выполнения программы
Исключения exception — это средство выхода из нормального потока управления блоком кода для обработки ошибок или других исключительных условий. Исключение поднимается в точке обнаружения ошибки. Оно может быть обработано окружающим блоком кода или любым блоком кода, который прямо или косвенно вызвал исключение exception .
Интерпретатор Python создает исключение, когда обнаруживает ошибку времени выполнения, например, деление на ноль. Программа Python также может явно вызвать исключение с помощью инструкции raise . Обработчики исключений указываются с помощью оператора try . except . Предложение finally такого оператора можно использовать для указания кода очистки, который не обрабатывает исключение, но выполняется независимо от того, произошло ли исключение в предыдущем коде.
Python использует модель «завершения» обработки ошибок: обработчик исключений может выяснить, что произошло, и продолжить выполнение на внешнем уровне, но он не может устранить причину ошибки и повторить неудачную операцию (за исключением повторного ввода нарушающего фрагмента кода сверху).
Когда исключение вообще не обрабатывается, интерпретатор прекращает выполнение программы или возвращается к своему интерактивному основному циклу. В любом случае он печатает трассировку стека, кроме случаев, когда поднимается исключение SystemExit .
Исключения определяются экземплярами классов. Предложение except выбирается в зависимости от класса экземпляра: оно должно ссылаться на класс экземпляра или его базовый класс. Экземпляр может быть получен обработчиком и может содержать дополнительную информацию об исключительном состоянии.
Заметка:
Сообщения об исключениях не являются частью Python API. Их содержимое может меняться от одной версии Python к другой без предупреждения и не должно зависеть от кода, который будет работать под несколькими версиями интерпретатора.
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Операция связывания имен с объектами.
- Правила разрешение имен
- Взаимодействие с динамическими функциями.
- Сценарий верхнего уровня ‘__main__’.
- Ошибки времени выполнения программы.
Источник: docs-python.ru
SQL-Ex blog
Обработка исключений в Python, используя Try, Except, Else и Finally
Добавил Sergey Moiseenko on Суббота, 22 апреля. 2023
Ошибки компиляции и времени исполнения являются двумя категориями проблем, которые могут возникать в любом языке программирования. Ошибки компиляции выявляются на стадии компиляции исходного кода и вызываются неправильным синтаксисом или семантикой. Ошибки времени исполнения обрабатываютcя иначе, и мы рассмотрим различные аспекты обработки на примере кода Python.
Обработка ошибок делает код более надежным, защищая его от ошибок, которые могут вызвать неожиданное прерывание работы программы. Концепция обработки исключений в Python используется для обслуживания ошибок и исключений.
Программа Python будет завершаться при возникновении ошибок, но это не всегда лучший образ действий. Например, мы не хотим, чтобы наш код неожиданно прерывался, когда конечный пользователь с ним работает. Обработка ошибок вносит исправление, которое делает наш код более устойчивым и предотвращает возможные сбои, приводящие к краху нашего приложения.
Различные недостатки всегда будут возникать при программировании. За некоторые проблемы отвечает наш код, например, за синтаксические ошибки. В большинстве случаев такую неточность называют багом. Недостатки должны исправляться.
- Диск может быть заполнен во время записи данных в файлы и препятствовать дальнейшей записи.
- Неожиданно обрушилась сеть во время загрузки той или иной информации.
- Использование 0 в знаменателе при делении.
Разница между ошибкой и исключением
Есть два типа ошибок в Python, которые мы должны хорошо понимать. Один тип — это синтаксические ошибки (или ошибки парсинга). При парсинге программы будет обнаружен ошибочный оператор. Ошибки этой природы не могут быть исправлены во время выполнения программы и требуют исправления кода.
Ошибки исключения — еще один тип ошибок, с которыми мы сталкиваемся. Эти ошибки имеют место, когда наш код синтаксически верен, но возникают непредвиденные ситуации при выполнении программы. Они относятся ко времени исполнения и не всегда смертельны. Далее в статье мы сосредоточимся на этих видах ошибок.
Типы ошибок
Синтаксические ошибки
Расположение букв и символов в коде называется синтаксисом. Поэтому, если вы встречаете синтаксическую ошибку, это обычно означает, что в вашем коде пропущен символ или буква. Python будет часто информировать вас о строке и местоположении проблемы. Сообщение об ошибке следует читать очень внимательно.
num1 = 2
num2 = 3
Num3 = num1 num2
print(num3)
Ошибка нехватки памяти
Если вы получаете сообщение об ошибке памяти, вашему программному обеспечению не хватает памяти. Это говорит о том, что ваше ПО создает слишком много объектов. Memory Error сигнализирует о нехватке доступной памяти для выделения интерпретатором вашему приложению Python. Это может быть проблемой конфигурирования Python или проблемой, связанной с функцией загрузки многих конкурирующих за ресурсы данных.
Ошибка рекурсии
Когда интерпретатор Python при выполнении вашей программы превышает предел рекурсии, возникает исключение Python Recursion Error. Предел рекурсии в Python может быть увеличен, или ваш код может быть переделан, чтобы использовать итерацию, а не рекурсию, чтобы избавиться от этой ошибки.
def abc():
return abc()
abc()
Ошибка отступа
Python является процедурным языком, поэтому если вы не поместите табулятор или пробелы между строкам вашего кода, то, вероятно, получите ошибку Indentation Error.
for i in range(3):
print(i)
Что такое обработка исключений в Python?
Вы можете с удобством обслуживать исключения, благодаря встроенной в Python системе обработки исключений. Это механизм try. except. finally.
Все исключения в Python должны быть экземплярами классов, происходящими от Base Exception. Python предлагает разнообразные исключения для часто случающихся ситуаций.
Обычные типы исключений в Python
Ошибка атрибута
Ошибки, связанные со ссылками на атрибуты или присвоением.
Ошибка индекса
Ошибка возникает, когда индекс последовательности выходит за границы.
arr = [1,2,3,4,5]
print(arr[200])
Ошибка деления на нуль
Когда целое делится на 0, возникает Zero Division Error.
arr = 1
arr = 0
print(a/b)
Ошибка типа
Эта ошибка возникает, когда в операции или методе используется объект неправильного типа.
arr = [1,2,3,4,5]
arr.insert(1)
Ошибка значения
Эта ошибка возникает, когда функция получает аргумент правильного типа, но неверное значение.
import math
math.sqrt(-33)
Ошибка имени
Эта ошибка возникает, когда идентификатор не находится ни в локальном, ни в глобальном пространстве имен.
Ошибка ключа
Эта ошибка возникает, когда словарь не включает заданный ключ.
Ошибка импорта
Эта ошибка возникает, когда модуль не может быть загружен оператором import.
from math import add
Предложение Try и оператор Except
Теперь, когда мы вполне осознаем множество дефектов времени выполнения, которые могут привести к нештатному поведению наших программ, мы готовы к решению таких проблем. В Python мы строим блоки try и except для обработки исключений.
Синтаксис
try:
#возможный блок кода, который может вызвать исключение
except Exception:
#Код, который реагирует на возникающую ошибку
Замечание. Один блок try может обрабатывать множество блоков except для различных исключений.
Наша программа стартует в блоке try и начинает выполнение. Если возникает исключение, создается объект типа Exception, обрабатывается и перехватывается блоком except. После завершения блока try и при отсутствии исключений блок except пропускается и выполняется следующий оператор, если он есть. В противном случае программа завершается нормально.
Пример
a = input («enter the Numerator:»)
b = input («enter the Denominator:»)
try:
res = int(a) / int(b)
print (‘result is:’, res)
except ZeroDivisionError as e:
print (‘exception is:’, e)
Как видно в примере выше, мы можем включить в оператор try часть кода, которая способна вызвать исключение. Блок кода оператора except будет выполняться, если исключения действительно произойдут.
Ошибки могут быть разнообразными. Следует использовать различные блоки except для обработки возникающих ошибок различного вида. Конечно, можно перехватить более одного типа ошибок.
Try с предложением Finally
Предложение finally будет выполнено вне зависимости от того, произошло ли исключение. Эта функциональность довольно полезна, когда нам нужно гарантировать, что нечто будет сделано вне зависимости от попадания в исключение. Например, мы должны всегда гарантировать закрытие файла при завершении работы с ним.
Пример блока Finally
a = input («enter the Numerator:»)
b = input («enter the Denominator:»)
try:
res = int(a) / int(b)
print (‘result is:’, res)
except ZeroDivisionError as e:
print (‘exception is:’, e)
finally:
print («thank you»)
Try с предложением Else
При отсутствии исключений мы можем также приказать программе выполнить код, используя условие else. При отсутствии исключений программа будет выполнять предложение else.
Пример блока Else
a = input («enter the Numerator:»)
b = input («enter the Denominator:»)
try:
res = int(a) / int(b)
print (‘result is:’, res)
except ZeroDivisionError as e:
print (‘exception is :’, e)
else:
print(«hello»)
finally:
print («thank you»)
Захват конкретных исключений в Python
Как мы уже установили, одинаковая обработка каждой ситуации и захват каждого исключения в предложении except не является хорошей практикой программирования. Следует указывать конкретные исключения, которые будет перехватывать предложение except. Мы можем захватить только встроенное исключение ошибки имени, которое будет обрабатывать исключение, когда пользователь введет некорректное имя.
Пример
def name_exception():
try:
value = «achyut tripathi»
return xyz
except NameError:
return «NameError occurred»
Вызов исключения в Python
В некоторых обстоятельствах мы должны выполнить пользовательскую логику, чтобы остановить операцию с помощью уникальной ошибки или исключения. Пользовательское исключение, которое будет обрабатывать блок «try-except», может использоваться, чтобы вызвать завершение исполнения.
Пример
Создадим небольшую функцию, которая ожидает число между 1 и 50. Если функция получает значение за пределами этого диапазона, работа приложения будет прервана с помощью пользовательского исключения.
def range_function(range):
try:
if range > 50 or range 0:
print(«Range is ok»)
except:
print(«Exception Occurred»)
range_function(150)
Заключение
Примеры в этом руководстве показывают как использовать в Python блок «try-except-finally».
Когда ваш код попадает в производственную среду, обработка ошибок — отличный способ гарантировать, что он ориентирован на будущее. Конечно, юнит-тестирование и реализация ООП также важны. Избегайте слишком большого числа блоков try и except, поскольку это несколько замедлит выполнение вашего кода и в целом его потребуется больше написать. Старайтесь не использовать его, если это не является абсолютно необходимым, например, когда требуется ввод данных пользователем или открывается файл.
Обратные ссылки
Нет обратных ссылок
Комментарии
Показывать комментарии Как список | Древовидной структурой
Автор не разрешил комментировать эту запись
Источник: sql-ex.ru