- Обработка исключений в Python – операторы try-expect, else, finally
- Общие исключения
- Проблема без обработки исключений
- Оператор try-expect
- Оператор except без исключения
- Оператор except с использованием переменной с исключением
- Что нужно помнить
- Объявление множественных исключений
- Блок try…finally
- Вызов исключений
- Пользовательское исключение
Обработка исключений в Python – операторы try-expect, else, finally
Исключение можно определить как необычное условие в программе, приводящее к прерыванию выполнения программы.
Всякий раз, когда возникает исключение, программа останавливает выполнение, и, таким образом, дальнейший код не выполняется. Таким образом, исключением являются ошибки времени выполнения, которые невозможно обработать скриптом Python. Исключением является объект Python, представляющий ошибку.
Python предоставляет способ обработки исключения, чтобы код мог выполняться без каких-либо перерывов. Если мы не обрабатываем исключение, интерпретатор не выполняет весь код, существующий после исключения.
Python имеет множество встроенных исключений, которые позволяют нашей программе работать без прерывания и выдавать результат. Эти исключения приведены ниже.
Общие исключения
Python предоставляет немалое количество встроенных исключений, но здесь мы описываем общие стандартные исключения. Список распространенных исключений, которые могут прервать стандартную программу Python:
- ZeroDivisionError: возникает при делении числа на ноль.
- NameError: возникает, когда имя не найдено. Может быть локальным или глобальным.
- IndentationError: если задан неправильный отступ.
- IOError: возникает при сбое операции ввода-вывода.
- EOFError: происходит, когда достигается конец файла, но операции выполняются.
Проблема без обработки исключений
Как мы уже обсуждали, исключение – это ненормальное состояние, которое останавливает выполнение программы.
Предположим, у нас есть две переменные a и b, которые принимают ввод от пользователя и выполняют деление этих значений. Что, если пользователь ввел ноль в качестве знаменателя? Это прервет выполнение программы и вызовет исключение ZeroDivision. Посмотрим на следующий пример.
a = int(input("Enter a:")) b = int(input("Enter b:")) c = a/b print("a/b = %d" %c) #other code: print("Hi I am other part of the program")
Enter a:10 Enter b:0 Traceback (most recent call last): File "exception-test.py", line 3, in c = a/b; ZeroDivisionError: division by zero
Вышеупомянутая программа синтаксически верна, но произошла ошибка из-за необычного ввода. Такой вид программирования может не подходить или не рекомендоваться для проектов, потому что эти проекты требуют непрерывного выполнения. Вот почему обработка исключений играет важную роль.
Оператор try-expect
Если программа Python содержит подозрительный код, который может вызвать исключение, мы должны поместить этот код в блок try. За блоком try должен следовать оператор except, который содержит блок кода, который будет выполнен, если в блоке try возникнет какое-либо исключение.
try: #block of code except Exception1: #block of code except Exception2: #block of code #other code
try: a = int(input("Enter a:")) b = int(input("Enter b:")) c = a/b except: print("Can't divide with zero")
Enter a:10 Enter b:0 Can't divide with zero
Мы также можем использовать оператор else с оператором try-except, в который мы можем поместить код, который будет выполняться в сценарии, если в блоке try не возникает исключения.
Синтаксис для использования оператора else с оператором try-except приведен ниже.
try: #block of code except Exception1: #block of code else: #this code executes if no except block is executed
Рассмотрим следующую программу.
try: a = int(input("Enter a:")) b = int(input("Enter b:")) c = a/b print("a/b = %d"%c) # Using Exception with except statement. If we print(Exception) it will return exception class except Exception: print("can't divide by zero") print(Exception) else: print("Hi I am else block")
Enter a:10 Enter b:0 can’t divide by zero
Оператор except без исключения
Python позволяет не указывать имя исключения в операторе исключения.
try: a = int(input("Enter a:")) b = int(input("Enter b:")) c = a/b; print("a/b = %d"%c) except: print("can't divide by zero") else: print("Hi I am else block")
Оператор except с использованием переменной с исключением
Мы можем использовать переменную исключения с оператором except. Он используется с помощью ключевого слова as, этот объект вернет причину исключения. Рассмотрим следующий пример:
try: a = int(input("Enter a:")) b = int(input("Enter b:")) c = a/b print("a/b = %d"%c) # Using exception object with the except statement except Exception as e: print("can't divide by zero") print(e) else: print("Hi I am else block")
Enter a:10 Enter b:0 can't divide by zero division by zero
Что нужно помнить
- Python позволяет нам не указывать исключение с помощью оператора except.
- Мы можем объявить несколько исключений в операторе except, поскольку блок try может содержать операторы, которые генерируют исключения другого типа.
- Мы также можем указать блок else вместе с оператором try-except, который будет выполнен, если в блоке try не возникнет исключение.
- Операторы, которые не вызывают исключения, должны быть помещены в блок else.
try: #this will throw an exception if the file doesn't exist. fileptr = open("file.txt","r") except IOError: print("File not found") else: print("The file opened successfully") fileptr.close()
Объявление множественных исключений
Python позволяет нам объявлять множественные исключения с помощью оператора except. Объявление нескольких исключений полезно в тех случаях, когда блок try вызывает несколько исключений. Синтаксис приведен ниже.
try: #block of code except(,,. ) #block of code else: #block of code
Рассмотрим следующий пример.
try: a=10/0; except(ArithmeticError, IOError): print("Arithmetic Exception") else: print("Successfully Done")
Блок try…finally
Python предоставляет оператор finally, который используется по желанию с оператором try. Он выполняется независимо от того, какое исключение возникает и используется для освобождения внешнего ресурса. Блок finally обеспечивает гарантию выполнения.
Мы можем использовать блок finally с блоком try, в котором мы можем выполнить необходимый код до того, как оператор try вызовет исключение.
Синтаксис для использования блока finally:
try: # block of code # this may throw an exception finally: # block of code # this will always be executed
try: fileptr = open("file2.txt","r") try: fileptr.write("Hi I am good") finally: fileptr.close() print("file closed") except: print("Error")
Вызов исключений
Исключение можно вызвать принудительно, используя условие raise в Python. Это полезно в том случае, когда нам нужно вызвать исключение, чтобы остановить выполнение программы.
Например, есть программа, для выполнения которой требуется 2 ГБ памяти, и если программа пытается занять 2 ГБ памяти, мы можем вызвать исключение, чтобы остановить выполнение программы.
Синтаксис для использования оператора повышения приведен ниже.
- Чтобы вызвать исключение, используется оператор raise. За ним следует имя класса исключения.
- В качестве исключения можно указать значение, которое может быть указано в скобках.
- Для доступа к значению «as» используется ключевое слово. «e» используется как ссылочная переменная, в которой хранится значение исключения.
- Мы можем передать значение исключению, чтобы указать тип исключения.
try: age = int(input("Enter the age:")) if(age<18): raise ValueError else: print("the age is valid") except ValueError: print("The age is not valid")
Enter the age:17 The age is not valid
Пример вызова с сообщением
try: num = int(input("Enter a positive integer: ")) if(numEnter a positive integer: -5 That is a negative number!try: a = int(input("Enter a:")) b = int(input("Enter b:")) if b is 0: raise ArithmeticError else: print("a/b = ",a/b) except ArithmeticError: print("The value of b can't be 0")Enter a:10 Enter b:0 The value of b can't be 0Пользовательское исключение
Python позволяет нам создавать наши собственные исключения, которые могут быть вызваны из программы и пойманы с помощью except.
class ErrorInCode(Exception): def __init__(self, data): self.data = data def __str__(self): return repr(self.data) try: raise ErrorInCode(2000) except ErrorInCode as ae: print("Received error:", ae.data)