Оглавление

Виды исключений

StopIteration

ZeroDivisionError

AttributeError

ImportError

IndexError

KeyError

SyntaxError

IndentationError

TabError

TypeError

ValueError

Как вызвать исключение?

Как обработать исключение?

Как создать собственное исключение?

Генераторы и итераторы

Стандартные итераторы

Списки

Кортежи

Словари

Генераторы

List comprehensions

Списки

Генераторы

Словари

Тернарные операции

Виды исключений

KeyboardInterrupt — порождается при прерывании программы пользователем (обычно сочетанием клавиш Ctrl + C).


                                                                          
import time
try:
   time.sleep(100)
except KeyboardInterrupt:
   print('KeyboardInterrupt')

Чтобы вызвать исключение KeyboardInterrupt, нужно запустить код выше и нажать комбинации клавиш Ctrl + C. 
                

StopIteration

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

ZeroDivisionError

деление на ноль.

AttributeError


                    
class SomeClass:
	pass

obj = SomeClass()
obj.unknown_field
                

ImportError

не удалось импортировать модуль.


                    
import timeeeee
                

IndexError

индекс не входит в диапазон элементов списка.


                    
arr = []
print(arr[1])
                

KeyError

несуществующий ключ в словаре.


                    
arr = {}
print(arr['key'])
                

SyntaxError

синтаксическая ошибка в коде.


                    
class A {
b: int
}
                

IndentationError

неправильные отступы. Может возникнуть, например, если написать тело цикла с разными отступами. Таких ошибок можно избежать, если пользоваться современными IDE, например PyCharm или Visual Code.


                    
for _ in range(10):
   print(1)
    print(2)
   print(3)
                

TabError

смешивание в отступах табуляции и пробелов.

TypeError

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


                    
1 + ''
                

ValueError

1. функция получает аргумент правильного типа, но некорректного значения. Рассмотрим функцию int, с помощью нее можно преобразовать строку в число.


                                                                          
i = int('123')

Код выполнится корректно, в переменной i окажется число 123. Но если вызвать int и передать строку,
которую невозможно преобразовать в число, например:

int('dfdf')

Будет вызвано искл
                

Как вызвать исключение?


                                                                          
Для вызова исключения нужно использовать ключевое слово raise:

raise ValueError
                

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


                    
raise ValueError('some message')
                

Как обработать исключение?

Этот код обработает исключение деления на 0 и выведет сообщение “I caught it”. Достаточно часто возникает потребность обработать несколько исключений. Это можно сделать двумя способами: 1. Этот способ применяется, если нужно обрабатывать ошибку KeyError


                                                                          
Для обработки исключения нужно использовать ключевые слова try catch.

try:
   1 / 0
except ZeroDivisionError:
   print("I caught it")
                

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


                    
try:
   value = int(d["key"])
except KeyError:
   print("key was not found")
except ValueError:
   print("key has incorrect value")
                

Для того чтобы перехватить все исключения, нужно использовать конструкцию без указания исключения:


                    
try:
   value = int(d["key"])
except (KeyError, ValueError):
   print("something wrong")
                

Или указав исключение-родителя:


                    
try:
   value = int(d["key"])
except:
   print("all")
                

                    
try:
   value = int(d["key"])
except Exception:
   print("all")
                

Как создать собственное исключение?

Необходимо создать класс-наследник от базового класса Exception.


                                                                                    
class SomeErr(Exception):
	pass

raise SomeErr
                                                      
Объявленное исключение будет обладать такими же свойствами,
что и стандартные исключения
                

Генераторы и итераторы

Итератор — любой объект, в котором есть два метода: __iter__ и __next__.


                    
class Counter:
   def __init__(self):
       self.n = 0

   def __iter__(self):
       return self

   def __next__(self):
       y = self.n
       self.n += 1
       return y
                

Стоит избегать прямого вызова __iter__ и __next__. При использовании for или list comprehension Python вызывает эти методы сам. Если все-таки необходимо вызвать методы напрямую, используйте встроенные функции iter и next. В параметры нужно передать итера


                    
c = Counter()
it = iter(c)
print(next(it))
print(next(it))
print(next(it))
print(next(it))
                

Стандартные итераторы

Списки


                                                                                                        
a = [1, 2, 3]
print(iter(a))
for item in a:
 print('arr item', item)
                

Кортежи


                                                                                                        
b = [1, 2, 3]
print(iter(b))
for item in b:
 print('tuple item', item)
                

Словари

Все вышеперечисленные объекты являются итераторами, они реализуют методы __iter__ и __next__


                    
c = {'var1': 1}
print(iter(c))
for item in c:
 print(item)
                

Генераторы

Генераторы — функции, которые внутри используют выражение yield. Каждый вызов метода __next__ у объекта-генератора возвращает следующее значение. Метод __iter__ также реализуется автоматически. То есть генераторы можно использовать везде, где требуются и


                    
def counter():
   n = 0
   while True:
       yield n
       n += 1

c = counter()
it = iter(c)
print(next(it))
print(next(it))
print(next(it))
print(next(it))
                

List comprehensions

Синтаксический «сахар», который позволяет свернуть стандартные конструкции языка (циклы и условия) до одной строки.

Списки


                    
lst = [item for item in arr]
                

Генераторы


                    
gen = (item for item in arr)
                

Словари

Во всех типах list comprehensions можно использовать условия. Например:


                    
dct = {item: item**2 for item in arr}
                

                                        
lst = [item for item in arr if item % 2 == 0]
В результирующем списке lst будут только элементы, которые делятся на 2.
                

Тернарные операции

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


                    
res = 'четное' if a % 2 else 'нечетное'
                

эквивалентно


                    
res = 'четное'
if a % 2:
 res = 'четное'
else:
 res = 'нечетное'
                
© 2023 Все права защищены