Работа с ошибками. Как ловить исключения и что потом с...
DESCRIPTION
Григорий Петров - Технический евангелист / NPTV / Россия, Москва В своем докладе Григорий расскажет о том, зачем в программах обрабатывать ошибки, какие они бывают и что нам предлагает python для работы с ними. http://www.it-sobytie.ru/events/2040TRANSCRIPT
![Page 1: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/1.jpg)
Работа над ошибкамиКак поймать исключение и остаться в живых
![Page 2: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/2.jpg)
Рассказывает и показывает
Петров Григорий
Технический евангелист Digital October
![Page 3: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/3.jpg)
Что такое ошибка?
![Page 4: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/4.jpg)
Что такое ошибка?
● Когда мы пишем код, у нас есть предположение о том, как он будет работать.
![Page 5: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/5.jpg)
Что такое ошибка?
● Когда мы пишем код, у нас есть предположение о том, как он будет работать.
● Когда мы его запускаем, часть наших предположений оказываются ошибочными.
![Page 6: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/6.jpg)
Что такое ошибка?
● Когда мы пишем код, у нас есть предположение о том, как он будет работать.
● Когда мы его запускаем, часть наших предположений оказываются ошибочными.
● Это — ошибки.
![Page 7: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/7.jpg)
Что такое ошибка?
● Когда мы пишем код, у нас есть предположение о том, как он будет работать.
● Когда мы его запускаем, часть наших предположений оказываются ошибочными.
● Это — ошибки.● Просто ошибки. Не “ошибки в программе”.
![Page 8: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/8.jpg)
Что такое ошибка?
Ошибка — это наши ошибочные предположения о том, как будет работать наш код.
![Page 9: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/9.jpg)
Откуда берутся ошибки?
Разное окружение:“А на моем компьютере все работает!”… а у пользователей такого файла нету.
![Page 10: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/10.jpg)
Откуда берутся ошибки?
Сложность -> Кошелек Миллера -> 7 ± 2“Рассмотрим эту простую функцию в 2000 строк кода…”
![Page 11: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/11.jpg)
И что с ними делать?
![Page 12: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/12.jpg)
И что с ними делать?
● Ничего не делать :)
![Page 13: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/13.jpg)
И что с ними делать?
● Ничего не делать :)● Обрабатывать.
![Page 14: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/14.jpg)
И что с ними делать?
● Ничего не делать :)● Обрабатывать.Ошибка — это несоответствие. Мы не можем “обработать несоответствие”.
![Page 15: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/15.jpg)
И что с ними делать?
● Ничего не делать :)● Привести код в соответствие.
○ Реагировать на разное окружение.○ Исправить логику работы.
![Page 16: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/16.jpg)
Исправление логики работы
Статические проверки:Компилятор/интерпретаторСтатический анализатор кода
Динамические проверки:Интерпретатор/runtimeASSERT / VERIFY / ENSURE
![Page 17: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/17.jpg)
Реакция на разное окружение
Файл не найден?
![Page 18: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/18.jpg)
Реакция на разное окружение
Файл не найден?Оборвалось сетевое подключение?
![Page 19: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/19.jpg)
Реакция на разное окружение
Файл не найден?Оборвалось сетевое подключение?Неподдерживаемая ОС?
![Page 20: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/20.jpg)
Реакция на разное окружение
Файл не найден?Оборвалось сетевое подключение?Неподдерживаемая ОС?Закончилась память?
![Page 21: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/21.jpg)
Реакция на разное окружение
Файл не найден?Оборвалось сетевое подключение?Неподдерживаемая ОС?Закончилась память?WTF?!? И что в таком случае делать?
![Page 22: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/22.jpg)
Где пролегает красная черта?
● Насколько разное окружение мы хотим поддерживать?
● Сколько времени мы готовы уделить борьбе со сложностью?
![Page 23: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/23.jpg)
Где пролегает красная черта?
Идеальная программа:Работает везде, как мы задумали
Хак на коленке:Иногда работает на компьютере автора
Красная черта
![Page 24: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/24.jpg)
Где пролегает красная черта?
Идеальная программа:Работает везде, как мы задумали
Хак на коленке:Иногда работает на компьютере автора
Наша черта. Где хотим, там и пролегает.
![Page 25: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/25.jpg)
Первый промежуточный итог
В зависимости от наших целей мы адаптируем программу к разным окружениям.
![Page 26: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/26.jpg)
Первый промежуточный итог
Ожидаемые ошибки
Разные окружения, которые мы хотим поддерживать.
Программа сама переживает несоответствие либо сообщает о нем пользователю.
Неожиданные ошибки
Разные окружения, которые мы не хотим поддерживать.
Программа завершается. Аварийно или красиво, на выбор разработчика.
![Page 27: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/27.jpg)
Реализация в коде
Тривиальная — через if:
if os.path.exists(path):
cfg = json.load(open(path))
else:
cfg = {“ver”: VERSION}
![Page 28: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/28.jpg)
Реализация в коде
Менее тривиальная — исключения:
try:
cfg = json.load(open(path))
except:
cfg = {“ver”: VERSION}
![Page 29: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/29.jpg)
В чем разница?
![Page 30: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/30.jpg)
В чем разница?
Чтобы ответить на этот вопрос, мне понадобится исторический экскурс.
![Page 31: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/31.jpg)
В чем разница?
Чтобы ответить на этот вопрос, мне понадобится исторический экскурсв C.
![Page 32: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/32.jpg)
За 10 000 лет до исключений
Нет никакой защиты: если не проверять все результаты, программа падает.
![Page 33: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/33.jpg)
За 10 000 лет до исключений
Нету никакой защиты: если не проверять все результаты, программа падает. продолжает работать с испорченной памятью и может повредить данные пользователя. А потом падает.
![Page 34: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/34.jpg)
Как это выглядело
Думаете, я вам покажу 1000 и 1 if? :)
![Page 35: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/35.jpg)
Как это выглядело
Думаете, я вам покажу 1000 и 1 if? :)Исключений тогда не было, но ребята были не глупее, чем мы.
![Page 36: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/36.jpg)
Как это выгляделоBOOL AddStrToFile(CHAR* str, CHAR* fname, OUT HANDLE* error)
{
PROLOGUE
ENSURE(IsValidStr(str));
HANDLE file = 0;
ENSURE(FileOpen(fname, OUT& file, OUT error));
REQUIRE(SUCCESS(error));
ENSURE(FileSeek(file, 0, SEEK_END));
ENSURE(FileWrite(file, fname));
REQUIRE(SUCCESS(error));
EPILOGUE
}
![Page 37: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/37.jpg)
Как это выгляделоBOOL AddStrToFile(CHAR* str, CHAR* fname, OUT HANDLE* error)
{
PROLOGUE
ENSURE(IsValidStr(str));
HANDLE file = 0;
ENSURE(FileOpen(fname, OUT& file, OUT error));
REQUIRE(SUCCESS(error));
ENSURE(FileSeek(file, 0, SEEK_END));
ENSURE(FileWrite(file, fname));
REQUIRE(SUCCESS(error));
EPILOGUE
}
неожиданные ошибкиожидаемые ошибки
![Page 38: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/38.jpg)
Как это выгляделоОжидаемая ошибка
...
if(!SUCCESS(error))
REQUIRE(error)
REQUIRE(error)
Неожиданная ошибка
if(!VERIFY(method1()))
ENSURE(method2())
ENSURE(method3())
ENSURE(method4())
![Page 39: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/39.jpg)
Что дали исключения
Синтаксический сахар для цепочки if’ов.Меньше кода, смысл тот же.
![Page 40: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/40.jpg)
Второй промежуточный итог
Исключения — это синтаксический сахар над двумя цепочками if’ов: для ожидаемых и неожиданных ошибок.
![Page 41: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/41.jpg)
Второй промежуточный итог
Исключения — это синтаксический сахар над двумя цепочками if’ов: для ожидаемых и неожиданных ошибок.Мы адаптируемся под ожидаемые ошибки и аварийно завершаемся при неожиданных.
![Page 42: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/42.jpg)
Как пользоваться?1. Пишем код без контроля ошибок2. Дописываем обработку ожидаемых ошибок3. Отлаживаем4. goto 25. profit
![Page 43: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/43.jpg)
Как пользоваться?1. Пишем код без контроля ошибок2. Дописываем обработку ожидаемых ошибок3. Отлаживаем4. goto 25. profit
Здесь у нас две проблемы
![Page 44: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/44.jpg)
Проблема иерархии исключений
Какие исключения бросает json.load?
![Page 45: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/45.jpg)
Проблема иерархии исключений
Какие исключения бросает json.load?Какие-то.
![Page 46: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/46.jpg)
Проблема неконсистентных API
Коды возврата ломают код обработки ошибок. Например:
mylib.create_connection()
Может вернуть None или исключение.
![Page 47: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/47.jpg)
Что делать?
![Page 48: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/48.jpg)
Что делать?
![Page 49: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/49.jpg)
Что делать?
Терпеть и кушать кактус :)
1. Для кода стандартной библиотеки иметь под рукой справочник исключений.
2. Для своего кода выделить ожидаемые (Expected) и неожиданные (Unexpected) исключения.
3. Оборачивать внешние библиотеки.
![Page 50: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)](https://reader034.vdocument.in/reader034/viewer/2022051314/54b635b94a795997578b473b/html5/thumbnails/50.jpg)
Это все.
Можно задавать вопросы.
Петров ГригорийТехнический евангелист Digital [email protected]://facebook.com/grigoryvp