Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Алгоритмизация и программирование. Язык Python. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
2.10.3. Исходный код программы
import math s = int(input(“Введите величину площади квадрата”)) a = math.sqrt(s) d = a * math.sqrt(2) print(“Площадь квадрата = ”+str(s)+ “, сторона квадрата = ”+str(a)+ “, диагональ квадрата = ”+str(d))
2.11. Обработка исключений
Обработка исключений в Python является механизмом по управлению программой в особых ситуациях, позволяющий обрабатывать аварийное завер­шениея вследствие внезапных и непредвиденных ошибок. Такая возможность реализована при помощи специальных синтаксических конструкций, позволя­ющих отлавливать, а затем обрабатывать исключения для того, чтобы програм­ма всегда выполняла заданный алгоритм.
Разработка программы на любом языке довольно часто бывает связана с возникновением различного рода ошибок, препятствующих получению резуль­тата. Как правило, не все они приводят к моментальному завершению програм­мы: некоторые ошибки можно ликвидировать еще на этапе компиляции, другие же способны оставаться незамеченными достаточно долгое время, а третьи и во-
все не зависят от программиста и возникают лишь в определенных ситуациях.
На сегодняшний день принято выделять такие типы ошибок:
синтаксические – ошибки, возникающие из-за синтаксических по-
грешностей кода;
логические – ошибки, проявляющиеся вследствие логических неточ-
ностей в алгоритме;
исключения – ошибки, вызванные некорректными действиями поль-
зователя или системы.
Синтаксические ошибки являются следствием несоблюдения общеприня­тых норм языка, например, пропуска круглой скобки в предполагаемом месте
или некорректного написания имени функции. Такие погрешности успешно от-
лавливаются компилятором, который сразу же сообщает пользователю о про-
блеме в написанном коде. Пример
# пропуск символов двойных кавычек при создании строкового литерала
print("Hello World!)
После попытки запуска выдастся текст ошибки: File "main.py", line 1 print("Hello World!) ^ SyntaxError: EOL while scanning string literal
31
Логические ошибки считаются более сложными в выявлении, поскольку не отлавливаются ни на этапе компиляции, ни во время выполнения готовой
программы. Обычно они вызваны определенными недостатками в логике напи­санного алгоритма, из-за чего пользователь не получает желаемого результата.
Пример
# функции должна вычислять среднее значение двух чисел, однако она этого не делает из-за неправильной формулы
def avg(a, b): return a + b / 2 print(avg(10, 20))
Результат: 20.
Исключения представляют собой еще один вид ошибок, который прояв­ляется в зависимости от наличия обстоятельств, меняющих ход выполнения
программы. Примером этому вполне может быть ввод некорректного значения
либо отсутствие нужного файла. Как правило, все доступные виды исключений
становятся видимыми во время выполнения программы. Пример
# пример, показывающий невозможность операции деления на ноль
print(10 / 0) Результат
Traceback (most recent call last): File "main.py", line 1, in <module> print(10 / 0) ZeroDivisionError: division by zero
Как можно заметить из результатов выполнения программы, деление на ноль провоцирует исключительную ситуацию, которая приводит к аварийному завершению работы и выводу ошибки на экран. В данном случае отображается файл, а также номер строки кода, где было выброшено исключение
ZeroDivisionError.
2.11.1. Перехват исключений
Для того, чтобы исключение не приводило к внезапному завершению
программы, его стоит обработать. Для этого есть специальный механизм, предотвращающего все непредвиденные ситуации. Это поможет избежать сбо­ев в работе написанного алгоритма за счет расширения его возможностей, поз-
воляющих действовать согласно новым обстоятельствам.
32
Пример
# сначала следует запустить программу, которая попытается открыть обычный текстовый файл
print("Program started") print("Opening file...") f = open("data.txt") print("Program finished")
После запуск будет выведено: Program started Opening file... Traceback (most recent call last): File "main.py", line 3, in <module> f = open("data.txt") FileNotFoundError: [Errno 2] No such file or directory: 'data.txt'
Так как файла с таким именем на жестком диске не обнаружено, программа
сгенерировала исключение FileNotFoundError, сообщающее о проблеме с вводом /
выводом. Последняя строка кода, в которой обозначается завершение программы, не была отображена на экране. Это значит, что не все операции, предусмотренные
алгоритмом, были выполнены из-за проявившегося исключения. Пример
# конструкциz try-except - позволяет обработать исключительную ситуацию без необходимости завершения уже работающей программы
print("Program started") try: print("Opening file...") f = open("data.txt") except: print("File not found!") #вывод сообщения об отсутствия файла print("Program finished")
Результат Program started Opening file... File not found! Program finished
Как видно из кода выше, блок try содержит опасный код, способный при-
вести к ошибке (отсутствие нужного файла), а блок except включает в себя ин­струкции, которые следует выполнить в случае возникнувшей проблемы. Те­перь если требуемый файл не был найден, программа не станет завершаться, о
чем свидетельствует последний вывод функции print.
33
2.11.2. Несколько блоков except
Блоков except может быть несколько, в зависимости от того, какой тип
исключения нужно обработать. Как правило, сначала обрабатываются более
частные случаи, а затем общие. Пример
print("Program started") try: print("Opening file...") f = open("data.txt") except FileNotFoundError: # возникла ситуации, связанная с отсутствием фай- ла print("File not found!") except Exception: print("Something gone wrong!") print("Program finished")
Результат Program started Opening file... File not found! Program finished
2.11.3. Вложенные блоки и else
Блоки try-except могут быть вложенными для более гибкого управления
исключениями. В следующем примере демонстрируется попытка открыть тек­стовый файл и записать в него некую строку. Для каждой цели используется
отдельный блок try. Также в данном примере используется конструкция else, которая выполняется в случае, если в коде не произошло исключений.
В данном случае else сработает при успешной операции write. По умолча-
нию файл открывается на чтение в текстовом режиме. Поэтому при открытии файла будем использовать режим w. В этом режиме файл открывается на за-
пись. Если файла не было – создается новый, если был – перезаписывается. Пример
print("Program started") try: print("Opening file...") f = open("data.txt", "w") try: print("Writing to file...") f.write("Hello World!") except Exception:
34
print("Something gone wrong!") else: print("Success!") except FileNotFoundError: print("File not found!") print("Program finished")
Результат Program started Opening file... Writing to file... Success! Program finished
2.11.4. Блок finally
Бывают ситуации, когда некие важные действия необходимо совершить вне зависимости от того, было вызвано исключение или нет. Для этого исполь­зуется блок finally, содержащий набор инструкций, которые нужно выполнить в
любом случае. Пример
# улучшение работы предыдущей программы, добавляя в нее возможность за­крывать текстовый файл
print("Program started") try: print("Opening file...") f = open("data.txt", "w") try: print("Writing to file...") f.write("Hello World!") except Exception: print("Something gone wrong!") else: print("Success!") finally: print("Closing file...") f.close() # закрытие файла except FileNotFoundError: print("File not found!") print("Program finished")
Результат Program started Opening file...
35
Writing to file... Success! Closing file... Program finished
Иногда такой подход к работе с текстовыми файлами может показаться слишком сложным, так как код, который его реализует, выглядит громоздким. Специально для этого существует конструкция with / as, позволяющая автома­тизировать некоторые методы, такие как закрытие файла у соответствующего
объекта. Таким образом, сокращается длина программного кода.
print("Program started") try: print("Writing to file...") with open("data.txt", "w") as f: f.write("Hello World!") except Exception: print("Something gone wrong!") print("Program finished")
Результат Program started Writing to file... Program finished
Как и во всех предыдущих случаях, программа, которая способна пра­вильно обработать все возникающие типы исключений, всегда завершается естественным образом, без прерываний заданного алгоритма. Это значительно
повышает комфорт и безопасность ее использования.
2.11.5. Пользовательские исключения
Python позволяет создавать пользовательские исключения. Как правило, исключения автоматически вызываются в нужных ситуациях, однако в Python
присутствует возможность запускать их самостоятельно. Для этого применяет­ся ключевое слово raise. Следом за ним необходимо создать новый объект типа Exception, который потом можно обработать при помощи привычных кон-
струкций try-except. Пример
print("Program started") try: raise Exception("User Exception!") except Exception as e: print(str(e)) print("Program finished")
36
Результат Program started User Exception! Program finished
Чтобы описать собственный тип исключения, нужно создать новый класс, унаследованный от базового типа Exception. Это позволит запускать особые ви­ды исключений в ситуациях, когда поведение пользователя не соответствует
алгоритму программы. В конструкторе Exception указываем текст исключения.
После того, как оно сработало и было перехвачено, его можно получить с по-
мощью str.
В следующем коде показан процесс генерации исключения NegativeAge, которое не позволяет пользователю ввести отрицательный возраст.
Пример
class NegativeAge(Exception): pass print("Program started") try: age = int(input("Enter your age: ")) if age < 0: raise NegativeAge("Exception: Negative age!") print("Success!") except NegativeAge as e: print(e) print("Program finished")
Результат Program started Enter your age: -18 Exception: Negative age! Program finished
2.11.6. Запись в лог
Для вывода специальных сообщений, не влияющих на функционирование
программы, в Python применяется библиотека логов. Чтобы воспользоваться
ею, необходимо выполнить импорт в верхней части файла. Существует не-
сколько типов логов.
Пример
import logging logging.basicConfig(level = logging.DEBUG) logging.debug("Debug message!") logging.info("Info message!")
37
logging.warning("Warning message!") logging.error("Error message!") logging.critical("Critical message!")
Результат DEBUG:root:Debug message! INFO:root:Info message! WARNING:root:Warning message! ERROR:root:Error message! CRITICAL:root:Critical message!
Как видно из результатов выполнения программы, пользователю доступ­ны разные типы сообщений, такие как предупреждение, информация или ошибка. Обычно они применяются при разработке программного обеспечения,
чтобы не выводить лишний текст в консоль. С помощью модуля logging можно записывать в лог и исключения. Обычно лог пишется в файл. Уровень INFO указывает, что сообщения уровней ниже (в данном случае debug) не будут от­ражаться в логе. Python позволяет в try-except получить текст ошибки.
Пример
import logging logging.basicConfig(filename="log.txt", level = logging.INFO) try: print(10 / 0) except Exception as e: logging.error(str(e))
В текстовый файл log .txt будет добавлена строка сообщения о типе сра­ботавшего исключения “ERROR:root:division by zero”.
2.11.7. Иерархия исключений
В языке программирования Python присутствует строгая иерархия исклю­чений. Вершиной является BaseException, включающий в себя все существую­щие разновидности исключений:
SystemExit – возникает при выходе из программы с помощью sys.exit;
KeyboardInterrupt – указывает на прерывание программы пользовате-
лем;
GeneratorExit – появляется при вызове метода close для объекта
generator;
Exception – представляет совокупность обычных несистемных исклю-
чений.
Перечень несистемных исключений, которые содержат в себе класс
Exception, приведены в следующей табл. 6.
38
Т а б л и ц а 6. Перечень несистемных исключений
Название
Характеристика
ArithmeticError
Порождается арифметическими ошибками (операции с пла-
вающей точкой, переполнение числовой переменной, деле-
ние на ноль)
AssertionError
Возникает при ложном выражении в функции assert
AttributeError
Появляется в случаях, когда нужный атрибут объекта отсут-
ствует
BufferError
Указывает на невозможность выполнения буферной опера-
ции
EOFError
Проявляется, когда функция не смогла прочитать конец фай-
ла
ImportError
Сообщает о неудачном импорте модуля либо атрибута
LookupError
Информирует про недействительный индекс или ключ в мас­сиве
MemoryError
Возникает в ситуации, когда доступной памяти недостаточно
NameError
Указывает на ошибку при поиске переменной с нужным
именем
NotImplementedError
Предупреждает о том, что абстрактные методы класса долж-
ны быть обязательно переопределены в классах-наследниках
OSError
Включает в себя системные ошибки (отсутствие доступа к нужному файлу или директории, проблемы с поиском про-
цессов)
ReferenceError
Порождается попыткой доступа к атрибуту со слабой ссыл-
кой
RuntimeError
Сообщает об исключении, которое не классифицируется
StopIteration
Возникает во время работы функции next при отсутствии элементов
SyntaxError
Представляет собой совокупность синтаксических ошибок
SystemError
Порождается внутренними ошибками системы
TypeError
Указывает на то, что операция не может быть выполнена с объектом
UnicodeError
Сообщает о неправильной кодировке символов в программе
ValueError
Возникает при получении некорректного значения для пере-
менной
Warning
Обозначает предупреждение
Исключения являются самостоятельным типом данных, при помощи ко­торого программа сообщает пользователю о различных ошибках. Обработка исключений позволяет менять сценарий выполнения программы с учетом об­стоятельств, так или иначе блокирующих ее нормальную работу. Для удобного
управления исключениями в языке программирования Python предусмотрены специальные синтаксические конструкции.
39
3. УПРАВЛЯЮЩИЕ КОНСТРУКЦИИ ЯЗЫКА
3.1. Условный оператор ветвления if
Оператор ветвления if позволяет выполнить определенный набор ин­струкций в зависимости от некоторого условия.
3.1.1. Конструкция if
Синтаксис оператора if :
if выражение: инструкция_ 1 инструкция_ 2 ... инструкция_n
После оператора if записывается выражение. Если это выражение истин­но, то выполняются инструкции, определяемые данным оператором. Выраже­ние является истинным, если его результатом является число не равное нулю, непустой объект, либо логическое True. После выражения нужно поставить двоеточие “:”.
Примеры
# Если a равно 3, то вывести hello 1
a = 3 if a == 3: print ( "hello 1" ) Результат: hello 1
# Если a больше 1, то вывести hello 2
a = 3 if a > 1 : print ( "hello 2" ) Результат: hello 2
# Если lst, то вывести hello 3
lst = [ 1 , 2 , 3 ] if lst: print ( "hello 3" ) Результат: hello 3
3.1.2. Конструкция if – else
Альтернативный вариант выполнения программы заключается в том, что при истинном условии нужно выполнить один набор инструкций, при ложном – другой. Для этого используется конструкция ifelse. Синтаксис конструкции
if-else:
40
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]