Как вызвать случайное исключение python

Как вызвать случайное исключение python

Иногда возникает необходимость вручную сгенерировать то или иное исключение. Для этого применяется оператор raise . Например, сгенерируем исключение

try: number1 = int(input("Введите первое число: ")) number2 = int(input("Введите второе число: ")) if number2 == 0: raise Exception("Второе число не должно быть равно 0") print("Результат деления двух чисел:", number1/number2) except ValueError: print("Введены некорректные данные") except Exception as e: print(e) print("Завершение программы")

Оператору raise передается объект BaseException — в данном случае объект Exception. В конструктор этого типа можно ему передать сообщение, которое затем можно вывести пользователю. В итоге, если number2 будет равно 0, то сработает оператор raise, который сгенерирует исключение. В итоге управление программой перейдет к блоку except , который обрабатывает исключения типа Exception:

Введите первое число: 1 Введите второе число: 0 Второе число не должно быть равно 0 Завершение программы

Создание своих типов исключений

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

class Person: def __init__(self, name, age): self.__name = name # устанавливаем имя self.__age = age # устанавливаем возраст def display_info(self): print(f"Имя: Возраст: ")

Здесь класс Person в конструкторе получает значения для имени и возраста и присваивает их приватным переменным name и age. Однако при создании объекта Person мы можем передать в конструктор некорректное с точки зрения логики значение — например, отрицательное число. Одним из способов решения данной ситуации представляет генерация исключения при передаче некорректных значений.

Читайте также:  Php date timezone настройка

Итак, определим следующий код программы:

class PersonAgeException(Exception): def __init__(self, age, minage, maxage): self.age = age self.minage = minage self.maxage = maxage def __str__(self): return f"Недопустимое значение: . " \ f"Возраст должен быть в диапазоне от до " class Person: def __init__(self, name, age): self.__name = name # устанавливаем имя minage, maxage = 1, 110 if minage < age < maxage: # устанавливаем возраст, если передано корректное значение self.__age = age else: # иначе генерируем исключение raise PersonAgeException(age, minage, maxage) def display_info(self): print(f"Имя: Возраст: ") try: tom = Person("Tom", 37) tom.display_info() # Имя: Tom Возраст: 37 bob = Person("Bob", -23) bob.display_info() except PersonAgeException as e: print(e) # Недопустимое значение: -23. Возраст должен быть в диапазоне от 1 до 110

В начале здесь определен класс PersonAgeException, который наследуется от класса Exception. Как правило, собственные классы исключений наследуются от класса Exception. Класс PersonAgeException предназначен для исключений, связанных с возрастом пользователя.

В конструкторе PersonAgeException получаем три значения - собственное некорректное значение, которое послужило причиной исключения, а также минимальное и максимальное значения возраста.

class PersonAgeException(Exception): def __init__(self, age, minage, maxage): self.age = age self.minage = minage self.maxage = maxage def __str__(self): return f"Недопустимое значение: . " \ f"Возраст должен быть в диапазоне от до "

В функции __str__ определяем текстовое представление класса - по сути сообщение об ошибке.

В конструкторе класса Persoon проверяем переданное для возраста пользователя значение. И если это значение не соответствует определенному диапазону, то генерируем исключение типа PersonAgeException:

raise PersonAgeException(age, minage, maxage)

При применении класса Person нам следует учитывать, что конструктор класса может сгенерировать исключение при передаче некорректного значения. Поэтому создание объектов Person обертывается в конструкцию try..except:

try: tom = Person("Tom", 37) tom.display_info() # Имя: Tom Возраст: 37 bob = Person("Bob", -23) # генерируется исключение типа PersonAgeException bob.display_info() except PersonAgeException as e: print(e) # Недопустимое значение: -23. Возраст должен быть в диапазоне от 1 до 110

И если при вызове конструктора Person будет сгенерировано исключение типа PersonAgeException, то управление программой перейдет к блоку except, который обрабатывает исключения типа PersonAgeException в виде вывода информации об исключении на консоль.

Источник

Обработка исключений в Python с использованием try, except и finally

В этом руководстве вы узнаете, как обрабатывать исключения в вашей программе Python с помощью операторов try, except и finally с помощью примеров.

Python имеет множество встроенных исключений, которые возникают, когда ваша программа обнаруживает ошибку (что-то в программе идет не так).

Когда возникают эти исключения, интерпретатор Python останавливает текущий процесс и передает его вызывающему процессу, пока он не будет обработан. Если не обработать, программа выйдет из строя.

Например, давайте рассмотрим программу, в которой у нас есть функция A, которая вызывает функцию B, она, в свою очередь, вызывает функцию C. Если исключение возникает в функции C, но не обрабатывается, исключение переходит в B, а затем в A.

Если этого не сделать, отображается сообщение об ошибке, и программа неожиданно останавливается.

В Python исключения можно обрабатывать с помощью оператора try.

Критическая операция, которая может вызвать исключение, помещается в предложение try. Код, обрабатывающий исключения, написан в разделе except.

Таким образом, мы можем выбрать, какие операции выполнять после того, как мы перехватили исключение. Вот простой пример:

# import module sys to get the type of exception import sys randomList = ['a', 0, 2] for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except: print("Oops!", sys.exc_info()[0], "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
The entry is a Oops! occurred. Next entry. The entry is 0 Oops! occured. Next entry. The entry is 2 The reciprocal of 2 is 0.5

В этой программе мы перебираем значения списка randomList . Как упоминалось ранее, часть, которая может вызвать исключение, помещается внутри блока try.

Если не возникает исключения, блок исключений пропускается и продолжается нормальный поток (для последнего значения). Но если возникает какое-либо исключение, оно перехватывается блоком except (первое и второе значения).

Здесь мы печатаем имя исключения, используя функцию exc_info() внутри модуля sys. Мы видим, что «a» вызывает ValueError, а 0 вызывает ZeroDivisionError.

Поскольку каждое исключение в Python наследуется от базового класса Exception, мы также можем выполнить указанную выше задачу следующим образом:

# import module sys to get the type of exception import sys randomList = ['a', 0, 2] for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except Exception as e: print("Oops!", e.__class__, "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)

Эта программа имеет тот же результат, что и вышеуказанная программа.

Выявление определенных исключений

В приведенном выше примере мы не упомянули какое-либо конкретное исключение в разделе except.

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

Предложение try может иметь любое количество предложений except для обработки различных исключений, однако только одно будет выполнено в случае возникновения исключения.

Мы можем использовать кортеж значений, чтобы указать несколько исключений в предложении except. Вот пример псевдокода.

try: # do something pass except ValueError: # handle ValueError exception pass except (TypeError, ZeroDivisionError): # handle multiple exceptions # TypeError and ZeroDivisionError pass except: # handle all other exceptions pass

Как вызвать исключение в Python?

В Python при возникновении ошибок во время выполнения возникают исключения. Мы также можем вручную вызывать исключения, используя ключевое слово Raise.

При желании мы можем передать значения исключению, чтобы выяснить, почему это исключение было вызвано.

>>> raise KeyboardInterrupt Traceback (most recent call last): . KeyboardInterrupt >>> raise MemoryError("This is an argument") Traceback (most recent call last): . MemoryError: This is an argument >>> try: . a = int(input("Enter a positive integer: ")) . if a 

С использованием else

В некоторых ситуациях вам может потребоваться запустить определенный блок кода, если внутри try выполняется без ошибок. В этих случаях вы можете использовать необязательное ключевое слово else с оператором try.

Примечание: Исключения в предложении else не обрабатываются предыдущими предложениями except.

Давайте посмотрим на пример:

# program to print the reciprocal of even numbers try: num = int(input("Enter a number: ")) assert num % 2 == 0 except: print("Not an even number!") else: reciprocal = 1/num print(reciprocal)

Если передать нечетное число:

Enter a number: 1 Not an even number!

Если мы передаем четное число, вычисляется и отображается обратная величина.

Однако, если мы передадим 0, мы получим ZeroDivisionError, поскольку блок кода внутри else не обрабатывается предшествующим исключением.

Enter a number: 0 Traceback (most recent call last): File "", line 7, in reciprocal = 1/num ZeroDivisionError: division by zero

Приложение finally

Оператор try в Python может иметь необязательное предложение finally. Этот пункт выполняется несмотря ни на что и обычно используется для освобождения внешних ресурсов.

Например, мы можем быть подключены к удаленному центру обработки данных через сеть или работать с файлом или через графический интерфейс пользователя (GUI).

Во всех этих обстоятельствах мы должны очистить ресурс до того, как программа остановится независимо от того, успешно она запущена или нет. Эти действия (закрытие файла, графический интерфейс или отключение от сети) выполняются в предложении finally, чтобы гарантировать выполнение.

Вот пример файловых операций, чтобы проиллюстрировать это.

try: f = open("test.txt",encoding = 'utf-8') # perform file operations finally: f.close()

Этот тип конструкции гарантирует, что файл будет закрыт, даже если во время выполнения программы возникает исключение.

Источник

Оцените статью