Учебники

Классы исключений и исключений

В общем, исключением является любое необычное состояние. Исключение обычно указывает на ошибки, но иногда они преднамеренно помещают в программу, например, в случае преждевременного завершения процедуры или восстановления после нехватки ресурсов. Существует ряд встроенных исключений, которые указывают условия, такие как чтение за концом файла или деление на ноль. Мы можем определить наши собственные исключения, называемые пользовательскими исключениями.

Обработка исключений позволяет вам корректно обрабатывать ошибки и делать с ними что-то значимое. Обработка исключений состоит из двух компонентов: «выбрасывание» и «отлов».

Выявление исключения (ошибки)

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

>>> #Exception
>>> 1/0
Traceback (most recent call last):
   File "<pyshell#2>", line 1, in <module>
      1/0
ZeroDivisionError: division by zero
>>>
>>> var = 20
>>> print(ver)
Traceback (most recent call last):
   File "<pyshell#5>", line 1, in <module>
      print(ver)
NameError: name 'ver' is not defined
>>> #Above as we have misspelled a variable name so we get an NameError.
>>>
>>> print('hello)

SyntaxError: EOL while scanning string literal
>>> #Above we have not closed the quote in a string, so we get SyntaxError.
>>>
>>> #Below we are asking for a key, that doen't exists.
>>> mydict = {}
>>> mydict['x']
Traceback (most recent call last):
   File "<pyshell#15>", line 1, in <module>
      mydict['x']
KeyError: 'x'
>>> #Above keyError
>>>
>>> #Below asking for a index that didn't exist in a list.
>>> mylist = [1,2,3,4]
>>> mylist[5]
Traceback (most recent call last):
   File "<pyshell#20>", line 1, in <module>
      mylist[5]
IndexError: list index out of range
>>> #Above, index out of range, raised IndexError.

Исключение ловли / отлова

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

синтаксис

try:
   #write some code
   #that might throw some exception
except <ExceptionType>:
   # Exception handler, alert the user

Код в предложении try будет выполняться оператор за оператором.

Если возникает исключение, оставшаяся часть блока try будет пропущена, и будет выполнено предложение исключений.

try:
   some statement here
except:
   exception handling

Давайте напишем некоторый код, чтобы увидеть, что происходит, когда вы не используете какой-либо механизм обработки ошибок в вашей программе.

number = int(input('Please enter the number between 1 & 10: '))
print('You have entered number',number)

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

Please enter the number between 1 > 10: 'Hi'
Traceback (most recent call last):
   File "C:/Python/Python361/exception2.py", line 1, in <module>
      number = int(input('Please enter the number between 1 & 10: '))
ValueError: invalid literal for int() with base 10: "'Hi'"

Теперь ValueError является типом исключения. Попробуем переписать приведенный выше код с обработкой исключений.

import sys

print('Previous code with exception handling')

try:
   number = int(input('Enter number between 1 > 10: '))

except(ValueError):
   print('Error..numbers only')
   sys.exit()

print('You have entered number: ',number)

Если мы запустим программу и введем строку (вместо числа), мы увидим, что получаем другой результат.

Previous code with exception handling
Enter number between 1 > 10: 'Hi'
Error..numbers only

Возбуждение исключений

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

raise ExceptionClass(‘Some Text Here’)

Давайте возьмем пример

def enterAge(age):
   if age<0:
      raise ValueError('Only positive integers are allowed')
   if age % 2 ==0:
      print('Entered Age is even')
   else:
      print('Entered Age is odd')

try:
   num = int(input('Enter your age: '))
   enterAge(num)
except ValueError:
   print('Only positive integers are allowed')

Запустите программу и введите положительное целое число.

Ожидаемый результат

Enter your age: 12
Entered Age is even

Но когда мы пытаемся ввести отрицательное число, мы получаем,

Ожидаемый результат

Enter your age: -2
Only positive integers are allowed

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

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

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

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

Создайте новый файл с именем NegativeNumberException.py и напишите следующий код.

class NegativeNumberException(RuntimeError):
   def __init__(self, age):
      super().__init__()
      self.age = age

Приведенный выше код создает новый класс исключений с именем NegativeNumberException, который состоит только из конструктора, который вызывает конструктор родительского класса с помощью super () __ init __ () и устанавливает возраст.

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

from NegativeNumberException import NegativeNumberException
def enterage(age):
   if age < 0:
      raise NegativeNumberException('Only positive integers are allowed')

   if age % 2 == 0:
      print('Age is Even')

   else:
      print('Age is Odd')

try:
   num = int(input('Enter your age: '))
   enterage(num)
except NegativeNumberException:
   print('Only positive integers are allowed')
except:
   print('Something is wrong')

Выход

Enter your age: -2
Only positive integers are allowed

Другой способ создать пользовательский класс Exception.

class customException(Exception):
   def __init__(self, value):
      self.parameter = value

   def __str__(self):
      return repr(self.parameter)
try:
   raise customException('My Useful Error Message!')
except customException as instance:
   print('Caught: ' + instance.parameter)

Выход

Caught: My Useful Error Message!

Иерархия исключений

Иерархия классов для встроенных исключений —