Неактивна зіркаНеактивна зіркаНеактивна зіркаНеактивна зіркаНеактивна зірка
 

Виключення в 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!")