Работа с ошибками. Как ловить исключения и что потом с...

50
Работа над ошибками Как поймать исключение и остаться в живых

Upload: it-

Post on 14-Jan-2015

267 views

Category:

Education


4 download

DESCRIPTION

Григорий Петров - Технический евангелист / NPTV / Россия, Москва В своем докладе Григорий расскажет о том, зачем в программах обрабатывать ошибки, какие они бывают и что нам предлагает python для работы с ними. http://www.it-sobytie.ru/events/2040

TRANSCRIPT

Page 1: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Работа над ошибкамиКак поймать исключение и остаться в живых

Page 2: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Рассказывает и показывает

Петров Григорий

Технический евангелист Digital October

Page 3: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Что такое ошибка?

Page 4: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Что такое ошибка?

● Когда мы пишем код, у нас есть предположение о том, как он будет работать.

Page 5: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Что такое ошибка?

● Когда мы пишем код, у нас есть предположение о том, как он будет работать.

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

Page 6: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Что такое ошибка?

● Когда мы пишем код, у нас есть предположение о том, как он будет работать.

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

● Это — ошибки.

Page 7: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Что такое ошибка?

● Когда мы пишем код, у нас есть предположение о том, как он будет работать.

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

● Это — ошибки.● Просто ошибки. Не “ошибки в программе”.

Page 8: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Что такое ошибка?

Ошибка — это наши ошибочные предположения о том, как будет работать наш код.

Page 9: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Откуда берутся ошибки?

Разное окружение:“А на моем компьютере все работает!”… а у пользователей такого файла нету.

Page 10: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Откуда берутся ошибки?

Сложность -> Кошелек Миллера -> 7 ± 2“Рассмотрим эту простую функцию в 2000 строк кода…”

Page 11: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

И что с ними делать?

Page 12: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

И что с ними делать?

● Ничего не делать :)

Page 13: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

И что с ними делать?

● Ничего не делать :)● Обрабатывать.

Page 14: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

И что с ними делать?

● Ничего не делать :)● Обрабатывать.Ошибка — это несоответствие. Мы не можем “обработать несоответствие”.

Page 15: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

И что с ними делать?

● Ничего не делать :)● Привести код в соответствие.

○ Реагировать на разное окружение.○ Исправить логику работы.

Page 16: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Исправление логики работы

Статические проверки:Компилятор/интерпретаторСтатический анализатор кода

Динамические проверки:Интерпретатор/runtimeASSERT / VERIFY / ENSURE

Page 17: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Реакция на разное окружение

Файл не найден?

Page 18: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Реакция на разное окружение

Файл не найден?Оборвалось сетевое подключение?

Page 19: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Реакция на разное окружение

Файл не найден?Оборвалось сетевое подключение?Неподдерживаемая ОС?

Page 20: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Реакция на разное окружение

Файл не найден?Оборвалось сетевое подключение?Неподдерживаемая ОС?Закончилась память?

Page 21: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Реакция на разное окружение

Файл не найден?Оборвалось сетевое подключение?Неподдерживаемая ОС?Закончилась память?WTF?!? И что в таком случае делать?

Page 22: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Где пролегает красная черта?

● Насколько разное окружение мы хотим поддерживать?

● Сколько времени мы готовы уделить борьбе со сложностью?

Page 23: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Где пролегает красная черта?

Идеальная программа:Работает везде, как мы задумали

Хак на коленке:Иногда работает на компьютере автора

Красная черта

Page 24: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Где пролегает красная черта?

Идеальная программа:Работает везде, как мы задумали

Хак на коленке:Иногда работает на компьютере автора

Наша черта. Где хотим, там и пролегает.

Page 25: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Первый промежуточный итог

В зависимости от наших целей мы адаптируем программу к разным окружениям.

Page 26: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Первый промежуточный итог

Ожидаемые ошибки

Разные окружения, которые мы хотим поддерживать.

Программа сама переживает несоответствие либо сообщает о нем пользователю.

Неожиданные ошибки

Разные окружения, которые мы не хотим поддерживать.

Программа завершается. Аварийно или красиво, на выбор разработчика.

Page 27: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Реализация в коде

Тривиальная — через if:

if os.path.exists(path):

cfg = json.load(open(path))

else:

cfg = {“ver”: VERSION}

Page 28: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Реализация в коде

Менее тривиальная — исключения:

try:

cfg = json.load(open(path))

except:

cfg = {“ver”: VERSION}

Page 29: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

В чем разница?

Page 30: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

В чем разница?

Чтобы ответить на этот вопрос, мне понадобится исторический экскурс.

Page 31: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

В чем разница?

Чтобы ответить на этот вопрос, мне понадобится исторический экскурсв C.

Page 32: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

За 10 000 лет до исключений

Нет никакой защиты: если не проверять все результаты, программа падает.

Page 33: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

За 10 000 лет до исключений

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

Page 34: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Как это выглядело

Думаете, я вам покажу 1000 и 1 if? :)

Page 35: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Как это выглядело

Думаете, я вам покажу 1000 и 1 if? :)Исключений тогда не было, но ребята были не глупее, чем мы.

Page 36: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Как это выглядело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: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Как это выглядело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: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Как это выгляделоОжидаемая ошибка

...

if(!SUCCESS(error))

REQUIRE(error)

REQUIRE(error)

Неожиданная ошибка

if(!VERIFY(method1()))

ENSURE(method2())

ENSURE(method3())

ENSURE(method4())

Page 39: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Что дали исключения

Синтаксический сахар для цепочки if’ов.Меньше кода, смысл тот же.

Page 40: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Второй промежуточный итог

Исключения — это синтаксический сахар над двумя цепочками if’ов: для ожидаемых и неожиданных ошибок.

Page 41: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Второй промежуточный итог

Исключения — это синтаксический сахар над двумя цепочками if’ов: для ожидаемых и неожиданных ошибок.Мы адаптируемся под ожидаемые ошибки и аварийно завершаемся при неожиданных.

Page 42: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Как пользоваться?1. Пишем код без контроля ошибок2. Дописываем обработку ожидаемых ошибок3. Отлаживаем4. goto 25. profit

Page 43: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Как пользоваться?1. Пишем код без контроля ошибок2. Дописываем обработку ожидаемых ошибок3. Отлаживаем4. goto 25. profit

Здесь у нас две проблемы

Page 44: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Проблема иерархии исключений

Какие исключения бросает json.load?

Page 45: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Проблема иерархии исключений

Какие исключения бросает json.load?Какие-то.

Page 46: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Проблема неконсистентных API

Коды возврата ломают код обработки ошибок. Например:

mylib.create_connection()

Может вернуть None или исключение.

Page 47: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Что делать?

Page 48: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Что делать?

Page 49: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Что делать?

Терпеть и кушать кактус :)

1. Для кода стандартной библиотеки иметь под рукой справочник исключений.

2. Для своего кода выделить ожидаемые (Expected) и неожиданные (Unexpected) исключения.

3. Оборачивать внешние библиотеки.

Page 50: Работа с ошибками. Как ловить исключения и что потом с ними делать (Григорий Петров)

Это все.

Можно задавать вопросы.

Петров ГригорийТехнический евангелист Digital [email protected]://facebook.com/grigoryvp