Исключение которое возникает при проблемах с оперативной памятью питон
Перейти к содержимому

Исключение которое возникает при проблемах с оперативной памятью питон

  • автор:

Исключения и их обработка в Python

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

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

>>> 1a = 10 File "", line 1 1a = 10 ^ SyntaxError: invalid decimal literal

В терминологии языка Python здесь возникло исключение, принадлежащее классу SyntaxError . Согласно документации Python синтаксические ошибки все-таки принято относить к ошибкам, а все остальные – к исключениям. В некоторых языках программирования не используется слово «исключение», а ошибки делят на синтаксические и семантические. Нарушение семантики обычно означает, что, хотя выражения написаны верно с точки зрения синтаксиса языка, программа не работает так, как от нее ожидалось. Для сравнения. Вы можете грамотным русским языком сказать несколько предложений, но по смыслу это будет белиберда, или вас поймут не так, как вы думали.

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

Если вы попытаетесь обратиться к переменной, которой не было присвоено значение, что в случае Python означает, что переменная вообще не была объявлена, она не существует, то возникнет исключение NameError .

>>> a = 0 >>> print(a + b) Traceback (most recent call last): File "", line 1, in NameError: name 'b' is not defined

Последнюю строку сообщения можно перевести как «Ошибка имени: имя ‘b’ не определено».

Если исключение возникает при выполнении кода из файла, то вместо line 1 будет указана строка, в которой оно возникло, например, line 24 . Вместо будет указано имя файла, например, test.py . В данном же случае stdin обозначает стандартный поток ввода. По-умолчанию это поток ввода с клавиатуры. Строка 1 – потому что в интерактивном режиме каждое выражение интерпретируется отдельно, как обособленная программка. Если написать выражение, состоящее из нескольких строк, то линия возникновения ошибки может быть другой:

>>> a = 0 >>> if a == 0: . print(a) . print(a + b) . 0 Traceback (most recent call last): File "", line 3, in NameError: name 'b' is not defined

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

>>> int("Hi") Traceback (most recent call last): File "", line 1, in ValueError: invalid literal for int() with base 10: 'Hi' >>> >>> 8 + "3" Traceback (most recent call last): File "", line 1, in TypeError: unsupported operand type(s) for +: 'int' and 'str'

В примере строку «Hi» нельзя преобразовать к целому числу. Возникает исключение ValueError , потому что функция int() не может преобразовать такое значение.

Число 8 и строка «3» принадлежат разным типам, операнд сложения между которыми не поддерживается. При попытке их сложить возникает исключение TypeError .

Деление на ноль вызывает исключение ZeroDivisionError :

>>> 1/0 Traceback (most recent call last): File "", line 1, in ZeroDivisionError: division by zero

Обработка исключений. Оператор try-except

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

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

В Питоне такой перехват выполняет оператор try-except. «Try» переводится как «попытаться», «except» – как исключение. Словами описать его работу можно так: «Попытаться сделать то-то и то-то, если при этом возникло исключение, то сделать вот это и это.» Его конструкция похожа на условный оператор с веткой else . Рассмотрим пример:

n = input("Введите целое число: ") try: n = int(n) print("Удачно") except: print("Что-то пошло не так")

Исключительная ситуация может возникнуть в третьей строчке кода, когда значение переменной n преобразуется к целому числу. Если это невозможно, то дальнейшее выполнение выражений в теле try прекращается. В данном случае выражение print(«Удачно») выполнено не будет. При этом поток выполнения программы перейдет на ветку except и выполнит ее тело.

Если в теле try исключения не возникает, то тело ветки except не выполняется.

Вот пример вывода программы, когда пользователь вводит целое число:

Введите целое число: 100 Удачно

А здесь – когда вводит не то, что ожидалось:

Введите целое число: AA Что-то пошло не так

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

try: n = input('Введите целое число: ') n = int(n) print("Все нормально. Вы ввели число", n) except ValueError: print("Вы ввели не целое число")

Теперь если сработает тело except мы точно знаем, из-за чего возникла ошибка. Но если в теле try возникнет еще какое-нибудь исключение, то оно не будет обработано. Для него надо написать отдельную ветку except . Рассмотрим программу:

try: a = float(input("Введите делимое: ")) b = float(input("Введите делитель: ")) c = a / b print("Частное: %.2f" % c) except ValueError: print("Нельзя вводить строки") except ZeroDivisionError: print("Нельзя делить на ноль")

При ее выполнении исключения могут возникнуть в трех строчках кода: где происходит преобразование введенных значений к вещественным числам и в месте, где происходит деление. В первом случае может возникнуть ValueError , во втором – ZeroDivisionError . Каждый тип исключения обрабатывается своей веткой except .

Несколько исключений можно сгруппировать в одну ветку и обработать совместно:

try: a = float(input("Введите делимое: ")) b = float(input("Введите делитель: ")) c = a / b print("Частное: %.2f" % c) except (ValueError, ZeroDivisionError): print("Нельзя вводить строки") print("или делить на ноль")

У оператора обработки исключений, кроме except , могут быть еще ветки finally и else (не обязательно обе сразу). Тело finally выполняется всегда, независимо от того, выполнялись ли блоки except в ответ на возникшие исключения или нет. Тело else сработает, если исключений в try не было, то есть не было переходов на блоки except .

try: n = input('Введите целое число: ') n = int(n) except ValueError: print("Неверный ввод") else: # когда в блоке try не возникло исключения print("Все нормально. Вы ввели число", n) finally: # выполняется в любом случае print("Конец программы")

Примечание. В данном коде используются комментарии. В языке Python перед ними ставится знак решетки # . Комментарии в программном коде пишутся исключительно для человека и игнорируются интерпретатором или компилятором.

Посмотрите, как выполняется программа в случае возникновения исключения и без этого:

Введите целое число: 4.3 Неверный ввод Конец программы
Введите целое число: 4 Все нормально. Вы ввели число 4 Конец программы

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

Также исключение может возникнуть в блоке except , else или finally , и тогда им нужен собственный обработчик. Модифицируем немного предыдущую программу и специально сгенерируем исключение в теле except :

try: n = input('Введите целое число: ') n = int(n) except ValueError: print("Неверный ввод") 3 / 0 except ZeroDivisionError: print("Деление на ноль") else: print("Все нормально. Вы ввели число", n) finally: print("Конец программы")

По началу может показаться, что все нормально. Исключение, генерируемое выражением 3 / 0 будет обработано веткой except ZeroDivisionError . Однако это не так. Эта ветка обрабатывает только исключения, возникающие в блоке try , к которому она сама относится. Вот вывод программы, если ввести не целое число:

Введите целое число: а Неверный ввод Конец программы Traceback (most recent call last): File "test.py", line 15, in n = int(n) ValueError: invalid literal for int() with base 10: 'а' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "test.py", line 18, in 3 / 0 ZeroDivisionError: division by zero

Мало того, что не было обработано деление на ноль, поскольку тело except ValueError неудачно завершилось, само исключение ValueError посчиталось необработанным. Решение проблемы может быть, например, таким:

except ValueError: print("Неверный ввод") try: 3 / 0 except ZeroDivisionError: print("Деление на ноль")

Здесь в тело except вложен свой внутренний обработчик исключений.

Практическая работа

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

Примеры выполнения программы:

Первое значение: 4 Второе значение: 5 Результат: 9.0
Первое значение: a Второе значение: 9 Результат: a9

Примеры решения и дополнительные уроки в pdf-версии курса

X Скрыть Наверх

Python. Введение в программирование

Исключения в python. Конструкция try — except для обработки исключений

Python 3 логотип

Исключения (exceptions) — ещё один тип данных в python. Исключения необходимы для того, чтобы сообщать программисту об ошибках.

Самый простейший пример исключения — деление на ноль:

Разберём это сообщение подробнее: интерпретатор нам сообщает о том, что он поймал исключение и напечатал информацию (Traceback (most recent call last)).

Далее имя файла (File «»). Имя пустое, потому что мы находимся в интерактивном режиме, строка в файле (line 1);

Выражение, в котором произошла ошибка (100 / 0).

Название исключения (ZeroDivisionError) и краткое описание исключения (division by zero).

Разумеется, возможны и другие исключения:

В этих двух примерах генерируются исключения TypeError и ValueError соответственно. Подсказки дают нам полную информацию о том, где порождено исключение, и с чем оно связано.

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

  • BaseException — базовое исключение, от которого берут начало все остальные.
    • SystemExit — исключение, порождаемое функцией sys.exit при выходе из программы.
    • KeyboardInterrupt — порождается при прерывании программы пользователем (обычно сочетанием клавиш Ctrl+C).
    • GeneratorExit — порождается при вызове метода close объекта generator.
    • Exception — а вот тут уже заканчиваются полностью системные исключения (которые лучше не трогать) и начинаются обыкновенные, с которыми можно работать.
      • StopIteration — порождается встроенной функцией next, если в итераторе больше нет элементов.
      • ArithmeticError — арифметическая ошибка.
        • FloatingPointError — порождается при неудачном выполнении операции с плавающей запятой. На практике встречается нечасто.
        • OverflowError — возникает, когда результат арифметической операции слишком велик для представления. Не появляется при обычной работе с целыми числами (так как python поддерживает длинные числа), но может возникать в некоторых других случаях.
        • ZeroDivisionError — деление на ноль.
        • IndexError — индекс не входит в диапазон элементов.
        • KeyError — несуществующий ключ (в словаре, множестве или другом объекте).
        • UnboundLocalError — сделана ссылка на локальную переменную в функции, но переменная не определена ранее.
        • BlockingIOError
        • ChildProcessError — неудача при операции с дочерним процессом.
        • ConnectionError — базовый класс для исключений, связанных с подключениями.
          • BrokenPipeError
          • ConnectionAbortedError
          • ConnectionRefusedError
          • ConnectionResetError
          • IndentationError — неправильные отступы.
            • TabError — смешивание в отступах табуляции и пробелов.
            • UnicodeEncodeError — исключение, связанное с кодированием unicode.
            • UnicodeDecodeError — исключение, связанное с декодированием unicode.
            • UnicodeTranslateError — исключение, связанное с переводом unicode.

            Теперь, зная, когда и при каких обстоятельствах могут возникнуть исключения, мы можем их обрабатывать. Для обработки исключений используется конструкция try — except.

            Первый пример применения этой конструкции:

              
            
              
            

            Ещё две инструкции, относящиеся к нашей проблеме, это finally и else. Finally выполняет блок инструкций в любом случае, было ли исключение, или нет (применима, когда нужно непременно что-то сделать, к примеру, закрыть файл). Инструкция else выполняется в том случае, если исключения не было.

            Для вставки кода на Python в комментарий заключайте его в теги

            Ошибки и встроенные исключения в Python

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

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

            1. Синтаксические.
            2. Логические (исключения).

            Ошибки синтаксиса

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

            Давайте посмотрим на один пример:

            >>> if a < 3 File "", line 1 if a < 3 ^ SyntaxError: invalid syntax

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

            Мы можем заметить здесь, что в операторе if отсутствует двоеточие.

            Логические ошибки (исключения)

            Ошибки, возникающие во время выполнения (после прохождения проверки синтаксиса), называются исключениями или логическими ошибками.

            Например, они возникают, когда мы пытаемся открыть файл (для чтения), который не существует (FileNotFoundError), пытаемся разделить число на ноль (ZeroDivisionError) или импортировать несуществующий модуль (ImportError).

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

            Давайте посмотрим, как Python обрабатывает эти ошибки:

            >>> 1 / 0 Traceback (most recent call last): File "", line 301, in runcode File "", line 1, in ZeroDivisionError: division by zero >>> open("imaginary.txt") Traceback (most recent call last): File "", line 301, in runcode File "", line 1, in FileNotFoundError: [Errno 2] No such file or directory: 'imaginary.txt'

            Встроенные исключения

            Незаконные операции могут вызывать исключения. В Python есть множество встроенных исключений, которые возникают при возникновении соответствующих ошибок. Мы можем просмотреть все встроенные исключения, используя встроенную функцию local() следующим образом:

            print(dir(locals()['__builtins__']))

            locals() [‘__ builtins__’] вернет модуль встроенных исключений, функций и атрибутов. dir позволяет нам перечислять эти атрибуты в виде строк.

            Ниже перечислены некоторые из распространенных встроенных исключений в программировании на Python, а также ошибки, вызывающие их:

            Исключение Причина ошибки
            AssertionError Возникает при сбое утверждения утверждения.
            AttributeError Возникает при сбое присвоения атрибута или ссылки.
            EOFError Возникает, когда функция input() достигает условия конца файла.
            FloatingPointError Возникает при сбое операции с плавающей запятой.
            ГенераторВыход Поднимается при вызове метода генератора close().
            ImportError Возникает, когда импортированный модуль не найден.
            IndexError Возникает, когда индекс последовательности выходит за пределы допустимого диапазона.
            KeyError Возникает, когда ключ не найден в словаре.
            KeyboardInterrupt Возникает, когда пользователь нажимает клавишу прерывания (Ctrl + C или Delete).
            MemoryError Возникает, когда для операции не хватает памяти.
            NameError Возникает, когда переменная не найдена в локальной или глобальной области.
            NotImplementedError Поднят абстрактными методами.
            OSError Возникает, когда работа системы вызывает ошибку, связанную с системой.
            OverflowError Возникает, когда результат арифметической операции слишком велик для представления.
            ReferenceError Возникает, когда слабый ссылочный прокси используется для доступа к референту со сборкой мусора.
            Ошибка выполнения Возникает, когда ошибка не попадает ни в одну другую категорию.
            StopIteration Вызывается функцией next(), чтобы указать, что итератор больше не возвращает элемент.
            Синтаксическая ошибка Возникает парсером при обнаружении синтаксической ошибки.
            IndentationError Возникает при неправильном отступе.
            TabError Возникает, когда отступ состоит из несовместимых знаков табуляции и пробелов.
            Системная ошибка Возникает, когда интерпретатор обнаруживает внутреннюю ошибку.
            SystemExit Вызывается функцией sys.exit().
            TypeError Возникает, когда функция или операция применяется к объекту неправильного типа.
            UnboundLocalError Возникает, когда делается ссылка на локальную переменную в функции или методе, но с этой переменной не привязано никакого значения.
            UnicodeError Возникает при возникновении ошибки кодирования или декодирования, связанной с Unicode.
            UnicodeEncodeError Возникает, когда во время кодирования возникает ошибка, связанная с Unicode.
            UnicodeDecodeError Возникает, когда во время декодирования возникает ошибка, связанная с Unicode.
            UnicodeTranslateError Возникает, когда во время перевода возникает ошибка, связанная с Unicode.
            ValueError Возникает, когда функция получает аргумент правильного типа, но неправильное значение.
            ZeroDivisionError Возникает, когда второй операнд деления или операции по модулю равен нулю.

            Ошибки и исключения

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *