0% нашли этот документ полезным (0 голосов)
3 просмотров9 страниц

Python

Документ описывает работу с исключениями в Python, включая использование блоков try и except для обработки ошибок. Он охватывает множественные блоки except, использование блока finally, а также генерацию пользовательских исключений с помощью оператора raise. Включены практические примеры и рекомендации по обработке различных типов исключений.

Загружено:

Sergey Ivanov
Авторское право
© © All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd
0% нашли этот документ полезным (0 голосов)
3 просмотров9 страниц

Python

Документ описывает работу с исключениями в Python, включая использование блоков try и except для обработки ошибок. Он охватывает множественные блоки except, использование блока finally, а также генерацию пользовательских исключений с помощью оператора raise. Включены практические примеры и рекомендации по обработке различных типов исключений.

Загружено:

Sergey Ivanov
Авторское право
© © All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd
Вы находитесь на странице: 1/ 9

День №11

Сегодня 🌞
11.0 Try и Except
1. Введение в исключения:
Понимание, что такое исключения и почему они важны.
Рассмотрение типов исключений, встроенных в Python (например, TypeError , ValueError ,
FileNotFoundError ).
2. Использование блока try-except:
Основы синтаксиса try и except .
Как использовать блок try для защиты от исключений.
Создание простых обработчиков исключений.

11.1 Множественные except


1. Обработка разных типов исключений:
Использование множественных блоков except для разных типов исключений.
Создание обработчиков для конкретных ошибок.
2. Обработка исключений без типа:
Использование except без указания конкретного типа исключения.
Как это может быть полезно при обработке неизвестных ошибок.

11.2 Продвинутая работа с исключениями


1. Использование else в блоке try:
Как добавить блок else после try-except для выполнения кода, который должен выполняться только в случае
отсутствия исключений.
Практические примеры, где это можно использовтаь (Элемент не найден в селениум и файл не открывается при
чтении json)
2. Обработка исключений во вложенных блоках:
Как обрабатывать исключения внутри других блоков try-except .
Создание более сложной логики обработки исключений.

11.3 Finally
1. Блок finally:
Введение в блок finally и его назначение.
Чем он отличается от else после try-except
Как использовать finally для выполнения кода после завершения блока try-except , независимо от того,
было ли исключение.
2. Исключения в блоке finally:
Как обрабатывать исключения, возникающие в блоке finally .
Влияние исключений в finally на обработку исключений в более высоких уровнях.
3. Исключения в блоке try с finally :
Как взаимодействуют исключения, возникающие в блоках try и finally .
Порядок выполнения кода в случае исключения в try и finally .

11.4 Raise
1. Генерация исключений:
Использование оператора raise для явного создания исключения.
Как передавать информацию и контекст в исключение.
Работа с as from в исключениях
2. Создание собственных исключений:
Как определять пользовательские исключения с помощью классов.
Добавление дополнительной информации и методов в пользовательские исключения.
3. Исключения и наследование:
Как использовать наследование для создания иерархии пользовательских исключений.
Преимущества структурирования исключений с помощью наследования.
4. Контекст исключений:
Понимание контекста исключений и его роли в отладке.
Как связывать исключения с предыдущими и добавлять контекст.

🚧 11.0 Try и Except


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

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


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

TypeError : возникает при выполнении операции с объектом неправильного типа.


ValueError : возникает, когда функция получает аргумент правильного типа, но с некорректным значением.
FileNotFoundError : возникает, когда попытка чтения или записи файла не удается из-за его отсутствия.
ZeroDivisionError : возникает при попытке деления на ноль.

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

🛡️ Использование блока try-except


Основы синтаксиса try и except
Блок try-except в Python позволяет обрабатывать исключения, возникающие во время выполнения программы. Если
код внутри блока try вызывает исключение, Python прерывает выполнение кода и переходит к соответствующему
блоку except для обработки этого исключения. Синтаксис выглядит следующим образом:

try:
# код, который может вызвать исключение
except Название_исключения:
# код, который будет выполнен, если возникнет исключение

Как использовать блок try для защиты от исключений


Давайте рассмотрим пример использования блока try-except для обработки исключения ValueError . Предположим, что
у нас есть функция divide , которая принимает два числа и возвращает их частное:

def divide(a, b):


return a / b

Очевидно, что при вызове этой функции с b равным нулю вернется исключение ZeroDivisionError . Чтобы
предотвратить ненадлежащую работу программы, можно использовать блок try-except :

try:
result = divide(10, 0)
except ZeroDivisionError:
print("Ошибка: деление на ноль!")

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

Создание простых обработчиков исключений


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

Рассмотрим пример функции, которая делит два числа, введенные пользователем:

def user_divide():
try:
a = float(input("Введите делимое: "))
b = float(input("Введите делитель: "))
result = a / b
except ValueError:
print("Ошибка: некорректное значение. Попробуйте еще раз!")
return user_divide()
except ZeroDivisionError:
print("Ошибка: деление на ноль! Используйте другое значение делителя.")
return user_divide()
return result

print(user_divide())

Здесь при возникновении исключения ValueError или ZeroDivisionError функция user_divide вызывает сама себя,
позволяя пользователю повторить ввод данных.

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

11.1 Множественные except


📌 Оглавление:

1. Обработка разных типов исключений


2. Обработка исключений без типа

11.1.1 🤔 Обработка разных типов исключений


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

try:
# Code that may raise exceptions
pass
except FileNotFoundError:
# Handle FileNotFoundError
pass
except ZeroDivisionError:
# Handle ZeroDivisionError
pass

Создание обработчиков для конкретных ошибок


Для создания обработчиков, специализированных на конкретных ошибках, можно воспользоваться as и записать
исключение в переменную. Эти переменные можно использовать для получения полезной информации об ошибке, а
также для использования в условиях в блоке except .

try:
# Code that may raise exceptions
pass
except FileNotFoundError as fne:
# Handle FileNotFoundError
print(f"File {fne.filename} not found.")
except ZeroDivisionError as zde:
# Handle ZeroDivisionError
print(f"Cannot divide by zero: {zde}")

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

11.1.2 🙃 Обработка исключений без типа


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

try:
# Code that may raise exceptions
pass
except:
# Handle any exception
print("An unexpected error occurred.")

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

Как это может быть полезно при обработке неизвестных ошибок


Хоть общий обработчик исключений без указания типа используется нечасто, иногда его применение оправдано,
например, в случаях:

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

Однако, даже используя обработчик без типа, лучше включить также обработку конкретных исключений перед
использованием except без типа:

try:
# Code that may raise exceptions
pass
except FileNotFoundError:
# Handle FileNotFoundError
pass
except ZeroDivisionError:
# Handle ZeroDivisionError
pass
except:
print("An unknown error occurred.")

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

11.2 Продвинутая работа с исключениями


🚀 Использование else в блоке try
🎯 Как добавить блок else после try-except
Блок else может быть добавлен после try-except , это позволяет выполнить код только в случае, если исключений
не возникло. Синтаксис выглядит следующим образом:

try:
# код, который может вызвать исключение
except SomeException:
# код для обработки исключения
else:
# код для выполнения, если исключение не возникло

📚 Практические примеры
🌐 Элемент не найден в Selenium

from selenium import webdriver


from selenium.common.exceptions import NoSuchElementException
driver = webdriver.Chrome()

try:
element = driver.find_element_by_css_selector('.element_class_name')
except NoSuchElementException:
print("Элемент не найден!")
else:
print("Найденный элемент:", element)

📂 Файл не открывается при чтении JSON

import json

try:
with open("data.json", "r") as f:
data = json.load(f)
except FileNotFoundError:
print("Файл data.json не найден!")
else:
print("Данные из файла JSON:", data)

🧐 Обработка исключений во вложенных блоках


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

Пример:

try:
# код, который может вызвать исключение №1
try:
# код, который может вызвать исключение №2
except SomeException2:
# код для обработки исключения №2
# дополнительный код после вложенного блока try-except,
# который должен быть выполнен, даже если возникло исключение №2
except SomeException1:
# код для обработки исключения №1

🧩 Создание более сложной логики обработки исключений


Вот пример использования вложенных блоков try-except для организации сложной логики обработки исключений:

try:
# код, который может вызвать исключение FileNotFoundError
with open("example.txt", "r") as f:
try:
# код, который может вызвать исключение ValueError
num = int(f.readline())
except ValueError:
print("Не удалось прочитать число из файла!")
# дополнительный код, который должен быть выполнен,
# даже если возникло исключение ValueError
print("Чтение из файла завершено.")
except FileNotFoundError:
print("Файл example.txt не найден!")

Если файл example.txt не найден, будет выведено сообщение "Файл example.txt не найден!". Если файл найден, но
первая строка не может быть преобразована в число, будет выведено сообщение "Не удалось прочитать число из
файла!". В любом случае после обработки исключений (если они были) будет выведено сообщение "Чтение из файла
завершено."
11.3 Finally 🏁
1. Блок finally: 📦
Введение в блок finally и его назначение 🎯
Блок finally используется для задания операторов, которые должны быть выполнены в любом случае, независимо от
того, возникло ли исключение в блоке try . Это может быть полезно для очистки ресурсов или закрытия файлов после
завершения работы с ними.

Чем он отличается от else после try-except ⚖️


finally отличается от else в конструкции try-except , поскольку операторы в блоке finally выполняются всегда,
в то время как операторы в блоке else выполняются только в том случае, если в блоке try не возникло исключений.

Как использовать finally для выполнения кода после завершения блока try-except ,
независимо от того, было ли исключение 🛠️
Применение блока finally выглядит следующим образом:

try:
print("Try block")
# Здесь можно выполнять операции, которые могут вызвать исключение
except Exception as e:
print(f"Exception caught: {e}")
finally:
print("Finally block")

В этом примере, строка print("Finally block") выполнится независимо от того, возникло исключение в блоке try
или нет.

2. Исключения в блоке finally: 🌀


Как обрабатывать исключения, возникающие в блоке finally 🧐
Блок finally также может породить исключения. Чтобы их обработать, можно поместить try-except непосредственно
в блок finally . Например:

try:
print("Try block")
except Exception as e:
print(f"Exception caught: {e}")
finally:
try:
print("Finally block")
# Здесь может возникнуть еще одно исключение
except Exception as e:
print(f"Exception in finally block: {e}")

Влияние исключений в finally на обработку исключений в более высоких уровнях 📈


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

3. Исключения в блоке try с finally : ⚠️


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

Порядок выполнения кода в случае исключения в try и finally 🔗


Для предотвращения потери информации об исключении из блоков try и finally , можно использовать вложенные
блоки try-except . Вот пример:
try:
try:
print("Try block")
# Здесь возникнет исключение
except Exception as e:
print(f"Exception caught: {e}")
finally:
try:
print("Finally block")
# Здесь возникнет еще одно исключение
except Exception as e:
print(f"Exception in finally block: {e}")

Этот пример позволяет обрабатывать исключения как в блоке try , так и в блоке finally , сохраняя информацию об
обоих исключениях.

11.4 Raise 🚀
1. Генерация исключений 💥
1.1 Использование оператора raise для явного создания исключения
В Python, raise используется для явной генерации исключений. Исключения могут возникать автоматически в
результате ошибок, но иногда полезно сгенерировать исключение в определенной точке кода с помощью оператора
raise .

def foo(x):
if x < 0:
raise ValueError("x должен быть положительным числом")

return x * 2

print(foo(-3))

В примере выше, функция foo вызывает исключение ValueError с помощью оператора raise , если аргумент x
меньше 0.

1.2 Как передавать информацию и контекст в исключение


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

def foo(x):
if x < 0:
raise ValueError(f"x должен быть положительным числом, а x={x}")

return x * 2

print(foo(-3))

В этом примере, мы передаем информацию об ошибке (значение x ) в сообщении исключения, что помогает определить
причину ошибки и исправить её.

1.3 Работа с as и from в исключениях


Python позволяет рассматривать созданное исключение как секцию контекста, используя оператор as после raise :

try:
x = int("five")
except ValueError as e:
raise TypeError("x должен быть числом") from e

Таким образом, мы можем сохранить исходное исключение ( ValueError , возникшее при конвертации строки "five" в
число) как контекст нового исключения ( TypeError ). Это упрощает отладку последующих проблем и сохраняет
сведения о первоначальной ошибке.
2. Создание собственных исключений 🛠️ (продвинутый уровень ⭐)
2.1 Как определять пользовательские исключения с помощью классов
Чтобы создать собственное исключение, мы должны определить новый класс, который наследует от базового класса
BaseException или одного из его подклассов.

class MyException(Exception):
pass

def foo():
raise MyException("Это мое исключение")

try:
foo()
except MyException as e:
print(f"Поймали мое исключение: {e}")

2.2 Добавление дополнительной информации и методов в пользовательские


исключения
Мы можем добавить дополнительную информацию и методы в пользовательское исключение, переопределив конструктор
и добавив новые методы.

class MyException(Exception):
def __init__(self, message, code):
super().__init__(message)
self.code = code

def get_code(self):
return self.code

def foo():
raise MyException("Это мое исключение", 42)

try:
foo()
except MyException as e:
print(f"Поймали мое исключение: {e}. Код ошибки: {e.get_code()}")

3. Исключения и наследование 🌳
3.1 Как использовать наследование для создания иерархии пользовательских
исключений
Используя наследование, мы можем создать иерархию пользовательских исключений, разделяя их по категориям и
уровням абстракции.

class MyExceptionBase(Exception):
pass

class MySpecificException1(MyExceptionBase):
pass

class MySpecificException2(MyExceptionBase):
pass

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

3.2 Преимущества структурирования исключений с помощью наследования


Структурирование исключений с помощью наследования имеет следующие преимущества:

Облегчает обработку группы исключений.


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

4.2 Как связывать исключения с предыдущими и добавлять контекст


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

try:
x = int("five")
except ValueError as e:
raise TypeError("x должен быть числом") from e

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

Вам также может понравиться