Kodomo

Пользователь

Обработка исключительной ситуации

Прошлогодний конспект

План

  1. Что такое стек вызовов
  2. Что такое исключительная ситуация (int(), open(), 1/0)? пример

  3. Как можно поступать в этом случае? (return, print, exit, исключение, continuation)
  4. Как это сделано в питоне?
  5. Обработка (try .. except)
  6. Сворачивание стека (пример).
  7. Создание человеческих сообщений об ошибках. stderr.
  8. Выход из нескольких вложенных циклов.
  9. Типы исключений.
  10. Обработка (try .. finally)
  11. assert

Контрольная работа

  1. Что ответит питон на такие строки?
       1  >>> f = { (2,2): 'O', (1,2): 'O', (2,1): 'O', (1,1): 'O' }
       2  >>> f.update({ (1,2): 'X', (1,1): 'X', (2,2): 'X' })
       3  >>> c = 0
       4  >>> for x, y in sorted(f):
       5  ...     if f[x, y] == 'O':
       6  ...         continue
       7  ...     if c >= 2:
       8  ...         break
       9  ...     print x, y
      10  ...     c = c + 1
    
  2. Опишите функцию unique, которая получает на вход список, который может содержать один и тот же элемент несколько раз, и возвращает список, содержащий каждый элемент входного списка только один раз, в произвольном порядке. Например, должен быть возможен такой диалог:

       1  >>> sorted(unique(["a", 2, 3, 2, 1, 2, 3]))
       2  [1, 2, 3, "a"]
    

Упражнения

  1. Если вы ещё не написали скрипт sum.py из 8-го занятия, напишите его в простейшей реализации (задание 1.a)1

  2. Доделайте скрипт sum.py таким образом, чтобы когда он натыкается на строку с синтаксической ошибкой, он сообщал об этом пользователю, но прдолжал считать сумму корректно.

  3. Доделайте скрипт sum.py таким образом, чтобы на все пользовательские ошибки он выдавал человеческие сообщения.

  4. Добавьте в скрипт требование, чтобы числа в строках были неотрицательными.
  5. Набейте в интерпретатор этот код:
       1  >>> import random
       2  >>> def toss():
       3  ...     if random.randint(0, 1):
       4  ...         raise Exception("Heads")
       5  >>> def a():
       6  ...     toss()
       7  ...     b()
       8  >>> def b():
       9  ...     toss()
      10  ...     a()
    
    • Запустите несколько раз функцию a(). Что делает функция toss()? Что делают функции a() и b()?

  1. Это тривиально. Самая дотошная реализация, включающая в себя комментарии и всю избыточную пляску с бубном занимает 15 строк и не несёт в себе ничего сложного. (1)