Виключення в Python. Обробка винятків (помилок) або виключень в Python необхідна для того, щоб програма продовжувала свою роботу після коректного виведення повідомлення про помилку (при необхідності можна таке повідомлення і не виводити, але обробити повідомлення потрібно, щоб код продовжував виконуватися).
Якщо виняток, не обробити, Python виведе системну помилку і виконання програми після помилки зупиниться.
Необхідно реалізувати повернення до подальшого коду в блоці try після обробки в ньому виключення в Python.
Повернення до коду в try після обробки в ньому виключення в Python
Завдання: повернення до поточного кроку циклу (або просто до коду) в блоці try після обробки в ньому винятку.
Прості приклади для обробки винятку описуємо стовпчиком в блоці try. Для пошуку і обробки помилок (наприклад, ділення на нуль) в блоці except прописуємо обробку даного виключення (помилки). Але за правилами обробки блоку try-except після обробки виключення програма вийде з цього блоку і продовжиться далі. З цієї причини код, який знаходиться в блоці try-except після виключення розглядатись не буде.
Після довгих спроб вийшло вирішити завдання найпростішим шляхом, але, швидше за все, воно неправильне, тому що вийшов дуже великий код з повторюваними блоками try-except. Подивимося це на прикладі простого калькулятора, де обчислення простих арифметичних задач має продовжитися навіть після обробки виключення поділу на нуль.
class MyException: a=15 b=0 c=5 d=10 try: print(a+b+c) except ZeroDivisionError as error: print("You can not divide by zero") try: print(a-b-c) except ZeroDivisionError as error: print("You can not divide by zero") try: print(a/c) except ZeroDivisionError as error: print("You can not divide by zero") try: print(a/b) except ZeroDivisionError as error: print("You can not divide by zero") try: print(a+b+c+d) except ZeroDivisionError as error: print("You can not divide by zero") try: print(a-b-c-d) except ZeroDivisionError as error: print("You can not divide by zero") print("Stop calculation!")
Є ще один можливий варіант вирішення даної задачі.
Повернення до циклу після обробки в ньому винятку
За допомогою циклу можна також обробити виключення таким чином, що код в блоці try після виведення помилки продовжить своє виконання і програма не вийде з блоку try-except, як це відбувається зазвичай.
Приклад простий — все той же калькулятор. Спочатку прописуємо змінні, з якими буде працювати і вирішувати найпростіші арифметичні дії. Потім в створеному класі необхідно визначити метод, в якому прописуємо кожному арифметичному прикладі змінну зі значенням від 1 до 6. Створюємо екземпляр класу, як зазвичай. Потім прописуємо цикл (ітератор) за допомогою конструктора циклу for і не забуваємо обробити виняток (поділ на нуль).
a=15, b=0, d=10, c=5, z=0 class MyException: def vozvrat(self,oper): if oper == 1: z = a+b+c elif oper == 2: z = a-b-c elif oper == 3: z = a/c elif oper == 4: z = a/b elif oper == 5: z = a+b+c+d elif oper == 6: z = a-b-c-d else: z = 255 return z test=MyException() for i in range(1,7): try: z = test.vozvrat(i) print(i,' = ',z) except ZeroDivisionError as error: print("You can not divide by zero") print("Stop calculation!")
Повернення до циклу після обробки виключення
Аналогічно також можна вирішити дану задачу з циклом while. На прикладі нижче все ясно, аналогічно коду вище. В даному випадку цикл працює до тих пір, поки змінна i менше 6, після кожного проходу до змінної додається одиниця.
a=15 b=0 d=10 c=5 z=0 class MyException: def vozvrat(self,oper): if oper == 1: z = a+b+c elif oper == 2: z = a-b-c elif oper == 3: z = a/c elif oper == 4: z = a/b elif oper == 5: z = a+b+c+d elif oper == 6: z = a-b-c-d else: z = 255 return z test=MyException() i=0 while i<6: try: i = i + 1 z = test.vozvrat(i) print(i,' = ',z) except ZeroDivisionError as error: print("You can not divide by zero") print("Stop calculation!")