SlideShare a Scribd company logo
Обработка ошибок
Технологии и языки программирования
Юдинцев В. В.
Кафедра теоретической механики
Самарский университет
2 декабря 2016 г.
Синтаксические ошибки
1 f o r i in range ( 5 )
2 p r i n t ( i )
SyntaxError : i n v a l i d syntax
Самарский университет Python: обработка ошибок 2 / 18
Ошибки времени выполнения
Арифметическая ошибка:
1 a = 1.0
2 f o r i in range ( 5 ) :
3 p r i n t ( a / i )
. . .
Ze r o D i v i s i o n E r r o r : d i v i s i o n by zero
Самарский университет Python: обработка ошибок 3 / 18
Ошибки времени выполнения
Ошибка при работе со словарём:
1 a = { ’ one ’ : ’один ’ , ’ two ’ : ’два ’ }
2 p r i n t ( a [ ’ three ’ ] )
. . .
KeyError : ’ three ’
Самарский университет Python: обработка ошибок 4 / 18
Обработка ошибок
Для самостоятельной обработки ошибок внутри программы,
возникающих во время выполнения, используются ключевые
слова try ... except:
1 t r y :
2 a = 1.0
3 s = 0
4 f o r i in range ( 5 ) :
5 s = s + a / i
6 p r i n t ( s )
7 except :
8 p r i n t ( ’Произошло деление на ноль ’ )
Любая ошибка во время выполнения программы внутри блока
try приведет к выполнению кода в блоке except.
Самарский университет Python: обработка ошибок 5 / 18
Обработка ошибки определённого типа
После ключевого слова except можно указать тип ошибки
1 t r y :
2 f = open ( ” d a t a f i l e . t x t ” , ” r ” )
3 a = f . readline ( )
4 except IOError :
5 p r i n t ( ’Невозможно открыть или прочитать файл ’ )
Блок except IOError: выполнится только если
произойдёт ошибка, связанная с вводом/выводом.
Ошибки других типов будут обрабатываться объемлющим
кодом.
Самарский университет Python: обработка ошибок 6 / 18
Типы исключений при работе с файлами
Другие типы исключений для работы с файлами:
FileNotFoundError
Открываемый файл или каталог не существует
FileExistsError
Создаваемый файл или каталог уже существует
PermissionError
Доступ к файлу или каталогу при недостаточном уровне
прав
Самарский университет Python: обработка ошибок 7 / 18
Иерархия исключений
BaseException
SystemExit
KeyboardInterrupt
Exception
ArithmeticError
OverflowError
ZeroDivisionError
FloatingPointError
LookupError
IndexError
KeyError
...
Все исключения кроме
SystemExit и
KeyboardInterrupt
являются потомками
базового класса
Exception.
Самарский университет Python: обработка ошибок 8 / 18
KeyError
Код в стиле EAFP: Easier to ask for forgiveness than permission
1 def p r i n t _ d i c t _ v a l ( d , my_key ) :
2 t r y :
3 p r i n t ( d [ my_key ] )
4 except KeyError :
5 p r i n t ( ’Ключ не найден : ’ , my_key )
или в стиле LBYL: Look before you leap
1 def p r i n t _ d i c t _ v a l ( d , my_key ) :
2 i f my_key in d :
3 p r i n t ( d [ my_key ] )
4 else :
5 p r i n t ( ’Ключ не найден : ’ , my_key )
Самарский университет Python: обработка ошибок 9 / 18
Дополнительная информация об ошибке
В блоке except можно указать имя переменной, которая будет
иметь тип ошибки и содержать информацию об ошибке:
1 t r y :
2 f = open ( ” d a t a f i l e . t x t ” , ” r ” )
3 a = f . readline ( )
4 except IOError as err :
5 p r i n t ( ’Невозможно открыть или прочитать файл ’ )
6 p r i n t ( ’Имя файла : ’ , err . filename )
Невозможно открыть или прочитать файл
Имя d a t a f i l e . txt
Самарский университет Python: обработка ошибок 10 / 18
Несколько блоков except
Блок try может вызывать ошибки различных типов. Для
каждого типа ошибки можно создать свой блок except, указав
тип ошибки:
1 t r y :
2 f = open ( ” d a t a f i l e . t x t ” , ” r ” )
3 s t r _ v a l u e = f . readline ( )
4 a = i n t ( s t r _ v a l u e )
5 except FileNotFoundError as err :
6 p r i n t ( ”Невозможно открыть или прочитать файл” )
7 except ValueError as err :
8 p r i n t ( ”Ошибка преобразования” )
9 except :
10 p r i n t ( ”Неизвестная ошибка” )
Самарский университет Python: обработка ошибок 11 / 18
Блок except для нескольких исключений
1 t r y :
2 f = open ( ” d a t a f i l e . t x t ” , ” r ” )
3 s t r _ v a l u e = f . readline ( )
4 a = i n t ( s t r _ v a l u e )
5 except ( FileNotFoundError , ValueError ) as err :
6 p r i n t ( ”Ошибка загрузки данных из файла” )
7 except :
8 p r i n t ( ”Неизвестная ошибка” )
Самарский университет Python: обработка ошибок 12 / 18
Конструкция try ... except ... else
В “защищаемом” участке кода делается попытка открыть файл
для чтения. Если файл не существует, но генерируется
исключение и управление передаётся блоку except, иначе
выполняется блок else:
1 t r y :
2 f = open ( ” d a t a f i l e . t x t ” , ” r ” )
3 except FileNotFoundError as err :
4 p r i n t ( ’Невозможно открыть или прочитать файл ’ )
5 p r i n t ( ’Имя файла : ’ , err . filename )
6 else :
7 a = f . readline ( )
Переменная f, объявленная в блоке try, доступна и в блоке
else.
Самарский университет Python: обработка ошибок 13 / 18
Блок finally
После блоков except и else может быть определён блок
finally, который выполняется в любом случае:
1 f = open ( ” d a t a f i l e . t x t ” , ” r ” )
2 t r y :
3 s t r _ v a l u e = f . readline ( )
4 a = i n t ( s t r _ v a l u e )
5 except ValueError as err :
6 p r i n t ( ”Ошибка преобразования” )
7 f i n a l l y :
8 f . close ( )
Файл закроется при любом исходе.
Самарский университет Python: обработка ошибок 14 / 18
Ввод данных с клавиатуры
1 s = f l o a t ( input ( ’Введите основание треугольника ’ ) )
2 h = f l o a t ( input ( ’Введите высоту треугольника ’ ) )
3
4 p r i n t ( ’Площадь треугольника равна {:1.2f}’ . format ( 0 . 5 * s * h ) )
При вводе не числовых значений программа сообщит об
ошибке и остановится:
Введите основание треугольника: a
. . .
. . .
ValueError: could not convert string to float: 'a'
Это плохая реакция программы на ошибку: нет возможности
исправить ошибку не перезапуская программу.
Самарский университет Python: обработка ошибок 15 / 18
Контроль ввода данных
1 def input_as ( text , type_of_value ) :
2 is_bad_input = True
3 while is_bad_input :
4 t r y :
5 val = input ( text )
6 val = type_of_value ( val )
7 is_bad_input = False
8 except ValueError as err :
9 p r i n t ( ”Это не ” + type_of_value . __name__+ ” ,
попробуйте еще раз . ” )
10 return val
val = input_as ( ”Введите целое число : ” , i n t )
p r i n t ( ”Введено значение” , val )
Самарский университет Python: обработка ошибок 16 / 18
Оператор raise
Если необходимо после обработки ошибки передать
управление обработчику ошибок верхнего уровня, необходимо
использовать оператор raise:
1 def divide ( a , b ) :
2 t r y :
3 res = a / b
4 except :
5 p r i n t ( ’ divide : b=0! ’ )
6 r a i s e
7 return res
1 t r y :
2 a = f l o a t ( input ( ’ a= ’ ) )
3 b = f l o a t ( input ( ’ b= ’ ) )
4 divide ( a , b ) :
5 except
6 p r i n t ( ’Неверные
исходные данные! ’ )
a: 1
b: 2
divide: b=0!
Неверные исходные данные!
Самарский университет Python: обработка ошибок 17 / 18
Оператор raise
При помощи оператора raise можно вызывать исключения
любых типов:
1 t r y :
2 msg = ’Введите число в диапазоне от { } до { } : ’
3 a , b = 1 , 10
4 x = i n t ( input ( msg . format ( a , b ) ) )
5 i f x<a or x>b :
6 msg = ’Значение { } вне диапазона { } , { } ’
7 r a i s e Exception ( msg . format ( x , a , b ) )
8 p r i n t ( x )
9 except Exception as err :
10 p r i n t ( err . args [ 0 ] )
Введите число в диапазоне от 1 до 10: 16
Значение 16 вне диапазона 1, 10
Самарский университет Python: обработка ошибок 18 / 18

More Related Content

PDF
Python: ввод и вывод
PDF
Алгоритмы и языки программирования
PPTX
алгоритмы stl
PPTX
стандартная библиотека с++: введение
PPS
встроен функции
PPTX
Cpp/cli particularities
PPTX
контейнеры STL
PPTX
особенности программирования на с++
Python: ввод и вывод
Алгоритмы и языки программирования
алгоритмы stl
стандартная библиотека с++: введение
встроен функции
Cpp/cli particularities
контейнеры STL
особенности программирования на с++

What's hot (20)

PPTX
библиотеки программирования
PPTX
C++ и базы данных
PDF
Python: Модули и пакеты
PPT
тема множество для загрузки 2013
PPTX
Cpp/cli types
PPT
5. java lecture io
PDF
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
PDF
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
PDF
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
PDF
Step cpp0201
PDF
Step cpp022
PDF
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
ODP
C language. Introduction
PPT
Join the python_side
PPT
Запись вспомогательный алгоритмов на языка Паскаль
PDF
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
PDF
C++ Базовый. Занятие 02.
PDF
Язык программирования Go для Perl-программистов
PDF
Discovering Lambdas in Java 8
PDF
библиотеки программирования
C++ и базы данных
Python: Модули и пакеты
тема множество для загрузки 2013
Cpp/cli types
5. java lecture io
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
Step cpp0201
Step cpp022
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
C language. Introduction
Join the python_side
Запись вспомогательный алгоритмов на языка Паскаль
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
C++ Базовый. Занятие 02.
Язык программирования Go для Perl-программистов
Discovering Lambdas in Java 8
Ad

Viewers also liked (20)

PDF
Основы Python. Функции
PDF
Основы MATLAB. Программирование
PDF
Случай Эйлера
PDF
Модификация механизма Йо-Йо
PDF
Динамика твёрдого тела: случай Лагранжа
PDF
Кватернионы
PDF
Основы языка Питон: типы данных, операторы
PDF
Основы MATLAB. Лекция 1.
PPTX
Docking with noncooperative spent orbital stage using probe-cone mechanism
PDF
Основы MATLAB. Численные методы
PPTX
Chaotic motions of tethered satellites with low thrust
PPTX
Научно-исследовательская работа кафедры Теоретической механики
PDF
Attitude Dynamics of Re-entry Vehicle
PDF
Python. Объектно-ориентированное программирование
PDF
Кинематические уравнения
PDF
Решение краевых задач методом конечных элементов
PDF
Метод конечных разностей
PDF
Углы Эйлера
PDF
Ортогональные матрицы
Основы Python. Функции
Основы MATLAB. Программирование
Случай Эйлера
Модификация механизма Йо-Йо
Динамика твёрдого тела: случай Лагранжа
Кватернионы
Основы языка Питон: типы данных, операторы
Основы MATLAB. Лекция 1.
Docking with noncooperative spent orbital stage using probe-cone mechanism
Основы MATLAB. Численные методы
Chaotic motions of tethered satellites with low thrust
Научно-исследовательская работа кафедры Теоретической механики
Attitude Dynamics of Re-entry Vehicle
Python. Объектно-ориентированное программирование
Кинематические уравнения
Решение краевых задач методом конечных элементов
Метод конечных разностей
Углы Эйлера
Ортогональные матрицы
Ad

More from Theoretical mechanics department (19)

PDF
Космический мусор
PDF
PDF
PDF
Машинная арифметика. Cтандарт IEEE-754
PDF
Deployers for nanosatellites
PPTX
CubeSat separation dynamics
PDF
Chaotic Behavior of a Passive Satellite During Towing by a Tether
PPTX
Транспортно-пусковой контейнер для наноспутников типоразмера 3U, 3U+
PPTX
On problems of active space debris removal using tethered towing
PDF
Методы решения нелинейных уравнений
PDF
Наноспутники формата кубсат
PDF
Отделение створок головного обтекателя
PPTX
1U-3U+ Cubesat Deployer by JSC SRC "Progress"
PDF
The Dynamics of Tethered Debris With Flexible Appendages and Residual Fuel
PDF
Метод Кейна
PDF
Метод отдельных тел
PDF
Метод Й. Виттенбурга (Универсальные и цилиндрические шарниры)
PDF
Метод Й. Виттенбурга (Сферические шарниры)
PDF
Основные принципы динамики твёрдого тела
Космический мусор
Машинная арифметика. Cтандарт IEEE-754
Deployers for nanosatellites
CubeSat separation dynamics
Chaotic Behavior of a Passive Satellite During Towing by a Tether
Транспортно-пусковой контейнер для наноспутников типоразмера 3U, 3U+
On problems of active space debris removal using tethered towing
Методы решения нелинейных уравнений
Наноспутники формата кубсат
Отделение створок головного обтекателя
1U-3U+ Cubesat Deployer by JSC SRC "Progress"
The Dynamics of Tethered Debris With Flexible Appendages and Residual Fuel
Метод Кейна
Метод отдельных тел
Метод Й. Виттенбурга (Универсальные и цилиндрические шарниры)
Метод Й. Виттенбурга (Сферические шарниры)
Основные принципы динамики твёрдого тела

Python. Обработка ошибок

  • 1. Обработка ошибок Технологии и языки программирования Юдинцев В. В. Кафедра теоретической механики Самарский университет 2 декабря 2016 г.
  • 2. Синтаксические ошибки 1 f o r i in range ( 5 ) 2 p r i n t ( i ) SyntaxError : i n v a l i d syntax Самарский университет Python: обработка ошибок 2 / 18
  • 3. Ошибки времени выполнения Арифметическая ошибка: 1 a = 1.0 2 f o r i in range ( 5 ) : 3 p r i n t ( a / i ) . . . Ze r o D i v i s i o n E r r o r : d i v i s i o n by zero Самарский университет Python: обработка ошибок 3 / 18
  • 4. Ошибки времени выполнения Ошибка при работе со словарём: 1 a = { ’ one ’ : ’один ’ , ’ two ’ : ’два ’ } 2 p r i n t ( a [ ’ three ’ ] ) . . . KeyError : ’ three ’ Самарский университет Python: обработка ошибок 4 / 18
  • 5. Обработка ошибок Для самостоятельной обработки ошибок внутри программы, возникающих во время выполнения, используются ключевые слова try ... except: 1 t r y : 2 a = 1.0 3 s = 0 4 f o r i in range ( 5 ) : 5 s = s + a / i 6 p r i n t ( s ) 7 except : 8 p r i n t ( ’Произошло деление на ноль ’ ) Любая ошибка во время выполнения программы внутри блока try приведет к выполнению кода в блоке except. Самарский университет Python: обработка ошибок 5 / 18
  • 6. Обработка ошибки определённого типа После ключевого слова except можно указать тип ошибки 1 t r y : 2 f = open ( ” d a t a f i l e . t x t ” , ” r ” ) 3 a = f . readline ( ) 4 except IOError : 5 p r i n t ( ’Невозможно открыть или прочитать файл ’ ) Блок except IOError: выполнится только если произойдёт ошибка, связанная с вводом/выводом. Ошибки других типов будут обрабатываться объемлющим кодом. Самарский университет Python: обработка ошибок 6 / 18
  • 7. Типы исключений при работе с файлами Другие типы исключений для работы с файлами: FileNotFoundError Открываемый файл или каталог не существует FileExistsError Создаваемый файл или каталог уже существует PermissionError Доступ к файлу или каталогу при недостаточном уровне прав Самарский университет Python: обработка ошибок 7 / 18
  • 8. Иерархия исключений BaseException SystemExit KeyboardInterrupt Exception ArithmeticError OverflowError ZeroDivisionError FloatingPointError LookupError IndexError KeyError ... Все исключения кроме SystemExit и KeyboardInterrupt являются потомками базового класса Exception. Самарский университет Python: обработка ошибок 8 / 18
  • 9. KeyError Код в стиле EAFP: Easier to ask for forgiveness than permission 1 def p r i n t _ d i c t _ v a l ( d , my_key ) : 2 t r y : 3 p r i n t ( d [ my_key ] ) 4 except KeyError : 5 p r i n t ( ’Ключ не найден : ’ , my_key ) или в стиле LBYL: Look before you leap 1 def p r i n t _ d i c t _ v a l ( d , my_key ) : 2 i f my_key in d : 3 p r i n t ( d [ my_key ] ) 4 else : 5 p r i n t ( ’Ключ не найден : ’ , my_key ) Самарский университет Python: обработка ошибок 9 / 18
  • 10. Дополнительная информация об ошибке В блоке except можно указать имя переменной, которая будет иметь тип ошибки и содержать информацию об ошибке: 1 t r y : 2 f = open ( ” d a t a f i l e . t x t ” , ” r ” ) 3 a = f . readline ( ) 4 except IOError as err : 5 p r i n t ( ’Невозможно открыть или прочитать файл ’ ) 6 p r i n t ( ’Имя файла : ’ , err . filename ) Невозможно открыть или прочитать файл Имя d a t a f i l e . txt Самарский университет Python: обработка ошибок 10 / 18
  • 11. Несколько блоков except Блок try может вызывать ошибки различных типов. Для каждого типа ошибки можно создать свой блок except, указав тип ошибки: 1 t r y : 2 f = open ( ” d a t a f i l e . t x t ” , ” r ” ) 3 s t r _ v a l u e = f . readline ( ) 4 a = i n t ( s t r _ v a l u e ) 5 except FileNotFoundError as err : 6 p r i n t ( ”Невозможно открыть или прочитать файл” ) 7 except ValueError as err : 8 p r i n t ( ”Ошибка преобразования” ) 9 except : 10 p r i n t ( ”Неизвестная ошибка” ) Самарский университет Python: обработка ошибок 11 / 18
  • 12. Блок except для нескольких исключений 1 t r y : 2 f = open ( ” d a t a f i l e . t x t ” , ” r ” ) 3 s t r _ v a l u e = f . readline ( ) 4 a = i n t ( s t r _ v a l u e ) 5 except ( FileNotFoundError , ValueError ) as err : 6 p r i n t ( ”Ошибка загрузки данных из файла” ) 7 except : 8 p r i n t ( ”Неизвестная ошибка” ) Самарский университет Python: обработка ошибок 12 / 18
  • 13. Конструкция try ... except ... else В “защищаемом” участке кода делается попытка открыть файл для чтения. Если файл не существует, но генерируется исключение и управление передаётся блоку except, иначе выполняется блок else: 1 t r y : 2 f = open ( ” d a t a f i l e . t x t ” , ” r ” ) 3 except FileNotFoundError as err : 4 p r i n t ( ’Невозможно открыть или прочитать файл ’ ) 5 p r i n t ( ’Имя файла : ’ , err . filename ) 6 else : 7 a = f . readline ( ) Переменная f, объявленная в блоке try, доступна и в блоке else. Самарский университет Python: обработка ошибок 13 / 18
  • 14. Блок finally После блоков except и else может быть определён блок finally, который выполняется в любом случае: 1 f = open ( ” d a t a f i l e . t x t ” , ” r ” ) 2 t r y : 3 s t r _ v a l u e = f . readline ( ) 4 a = i n t ( s t r _ v a l u e ) 5 except ValueError as err : 6 p r i n t ( ”Ошибка преобразования” ) 7 f i n a l l y : 8 f . close ( ) Файл закроется при любом исходе. Самарский университет Python: обработка ошибок 14 / 18
  • 15. Ввод данных с клавиатуры 1 s = f l o a t ( input ( ’Введите основание треугольника ’ ) ) 2 h = f l o a t ( input ( ’Введите высоту треугольника ’ ) ) 3 4 p r i n t ( ’Площадь треугольника равна {:1.2f}’ . format ( 0 . 5 * s * h ) ) При вводе не числовых значений программа сообщит об ошибке и остановится: Введите основание треугольника: a . . . . . . ValueError: could not convert string to float: 'a' Это плохая реакция программы на ошибку: нет возможности исправить ошибку не перезапуская программу. Самарский университет Python: обработка ошибок 15 / 18
  • 16. Контроль ввода данных 1 def input_as ( text , type_of_value ) : 2 is_bad_input = True 3 while is_bad_input : 4 t r y : 5 val = input ( text ) 6 val = type_of_value ( val ) 7 is_bad_input = False 8 except ValueError as err : 9 p r i n t ( ”Это не ” + type_of_value . __name__+ ” , попробуйте еще раз . ” ) 10 return val val = input_as ( ”Введите целое число : ” , i n t ) p r i n t ( ”Введено значение” , val ) Самарский университет Python: обработка ошибок 16 / 18
  • 17. Оператор raise Если необходимо после обработки ошибки передать управление обработчику ошибок верхнего уровня, необходимо использовать оператор raise: 1 def divide ( a , b ) : 2 t r y : 3 res = a / b 4 except : 5 p r i n t ( ’ divide : b=0! ’ ) 6 r a i s e 7 return res 1 t r y : 2 a = f l o a t ( input ( ’ a= ’ ) ) 3 b = f l o a t ( input ( ’ b= ’ ) ) 4 divide ( a , b ) : 5 except 6 p r i n t ( ’Неверные исходные данные! ’ ) a: 1 b: 2 divide: b=0! Неверные исходные данные! Самарский университет Python: обработка ошибок 17 / 18
  • 18. Оператор raise При помощи оператора raise можно вызывать исключения любых типов: 1 t r y : 2 msg = ’Введите число в диапазоне от { } до { } : ’ 3 a , b = 1 , 10 4 x = i n t ( input ( msg . format ( a , b ) ) ) 5 i f x<a or x>b : 6 msg = ’Значение { } вне диапазона { } , { } ’ 7 r a i s e Exception ( msg . format ( x , a , b ) ) 8 p r i n t ( x ) 9 except Exception as err : 10 p r i n t ( err . args [ 0 ] ) Введите число в диапазоне от 1 до 10: 16 Значение 16 вне диапазона 1, 10 Самарский университет Python: обработка ошибок 18 / 18