Автор оригинала: Pankaj Kumar.
Обработка исключения Python – попробуйте, кроме, наконец
- Исключения являются сценариями ошибок, которые изменяют нормальный поток выполнения программы.
- Процесс заботы о возможных исключениях называется обработкой исключения.
- Если исключения не обрабатываются должным образом, программа может расторгнуть преждевременно. Это может привести к повреждению данных или нежелательных результатах.
- Обработка исключения Python достигается тремя ключевое слово . Блоки – попробуйте, кроме, и, наконец.
- попробуйте Блок содержит код, который может повысить исключения или ошибки.
- кроме Блок используется, чтобы поймать исключения и справиться с ними.
- Код Catch Block выполняется только тогда, когда соответствующее исключение поднимается.
- Там могут быть несколько блоков Catch. Мы также можем поймать несколько исключений в одном блоке Catch.
- Наконец Блок-код всегда выполняется, должна ли программа выполнить правильно или подняла исключение.
- Мы также можем создать блок « else » с помощью блок TRY – кроме блока. Код внутри остального блока выполнен, если не подняты исключения.
Как обрабатывать исключения в Python?
Давайте посмотрим на пример, где нам нужна обработка исключений.
def divide(x, y): print(f'{x}/{y} is {x / y}') divide(10, 2) divide(10, 0) divide(10, 4)
Если мы запустим вышеуказанную программу, мы получаем следующий вывод.
10/2 is 5.0 Traceback (most recent call last): File "/Users/pankaj/Documents/PycharmProjects/PythonTutorialPro/hello-world/exception_handling.py", line 6, individe(10, 0) File "/Users/pankaj/Documents/PycharmProjects/PythonTutorialPro/hello-world/exception_handling.py", line 2, in divide print(f'{x}/{y} is {x / y}') ZeroDivisionError: division by zero
Второй вызов функции Divide () поднял ZerodivisionError Исключение и программа прекращена.
Мы никогда не получили вывод третьего вызова для разделения () метода, потому что мы не занимались обработкой исключения в нашем коде.
Давайте переписываем метод Divide () с надлежащей обработкой исключения. Если кто-то пытается разделить на 0, мы поймаем исключение и распечатаем сообщение об ошибке. Таким образом, программа не будет расторгнуто преждевременно, а выпуск будет иметь больше смысла.
def divide(x, y): try: print(f'{x}/{y} is {x / y}') except ZeroDivisionError as e: print(e) divide(10, 2) divide(10, 0) divide(10, 4)
Выход:
10/2 is 5.0 division by zero 10/4 is 2.5
Что такое класс baseexception?
Класс Baseexception – это базовый класс всех исключений. Он имеет четыре подкласса.
- Исключение – Это базовый класс для всех неходных исключений.
- Generatorexit – Запрос, чтобы выйти генератор.
- KeyboardInterrupt – Программа прервана пользователем.
- SystemExit – Запросить выйти из переводчика.
Некоторые встроенные классы исключения
Некоторые из встроенных классов исключения в Python являются:
- Арифметикрор – Это базовый класс для арифметических ошибок.
- AssertionError – поднял, когда утверждение не удается.
- AttributeError – Когда атрибут не найден.
- BufferError
- EOFERROR – Чтение после окончания файла
- ImportError – Когда импортируемый модуль не найден.
- Дисплеоперероль – Базовое исключение по ошибкам поиска.
- Memoryerror – Когда происходит вне памяти
- NameError – Когда имя не найдено глобально.
- Осэррор – Базовый класс для ошибок ввода/вывода
- Справочник
- Ошибка выполнения
- Заставка , Западасинтезация
- SyntaxError – Неверный синтаксис
- Системрор – Внутренняя ошибка в переводчике Python.
- Типеррор – неверный тип аргумента
- ValueError – Неверное значение аргумента
Некоторые встроенные предупреждающие классы
Предупреждающий класс является базовым классом для всех предупреждений. Он имеет следующие подклады.
- Byteswarning – Байты и предупреждения, связанные с буфером, в основном связанные с конвертацией и сравнением строки.
- Обесценивание сырьера – предупреждение о устаревших функциях
- Будущее – Базовый класс для предупреждения о конструкциях, которые будут изменяться семантически в будущем.
- ImportWarning – предупреждение о ошибках в импорте модуля
- Pendendeddeprecationwarning – предупреждение о признаках, которые будут устарены в будущем.
- ResourceWarning – Предупреждения об использовании ресурсов
- Runtimewarning – Предупреждения о сомнительном поведении время выполнения.
- Syntaxwarning – предупреждение о сомнительном синтаксисе
- Unicodewarning – Предупреждения, связанные с Unicode
- UserWarning – Предупреждения, генерируемые пользовательским кодом
Обращение с несколькими исключениями в одном кроме блока
Попробуйте блок может иметь несколько кроме блоков Отказ Мы можем поймать определенные исключения в каждом из за исключением блоков.
def divide(x, y): try: print(f'{x}/{y} is {x / y}') except ZeroDivisionError as e: print(e) except TypeError as e: print(e) except ValueError as e: print(e)
Код в каждом кроме блока одинаково. В этом сценарии мы можем обрабатывать несколько исключений в одном кроме блока. Мы можем передавать актуальные объекты исключения в кроме блока, чтобы поймать несколько исключений.
def divide(x, y): try: print(f'{x}/{y} is {x / y}') except (ZeroDivisionError, TypeError, ValueError) as e: print(e)
Catch – все исключения в одном кроме блока
Если мы не укажем какой-либо класс исключения в кроме блока, он будет ловить все исключения, поднятые блоком TRY. Это выгодно иметь это, когда мы не знаем об исключениях, что блок Try может поднять.
Пустое предложение, кроме как последнее в цепочке обработки исключений.
def divide(x, y): try: print(f'{x}/{y} is {x / y}') except ZeroDivisionError as e: print(e) except: print("unknown error occurred")
Использование остального блока с попробовать
Код остального блока является необязательным. Это выполняется, когда нет исключения, поднятых блоком TRY.
def divide(x, y): try: print(f'{x}/{y} is {x / y}') except ZeroDivisionError as e: print(e) else: print("divide() function worked fine.") divide(10, 2) divide(10, 0) divide(10, 4)
Выход:
Код остального блока выполняется в два раза, когда функция Divide () попробуйте блок работать без какого-либо исключения.
Используя наконец-то блок с попробовать
Наконец-то код блокировки выполняется во всех случаях, есть ли исключение или нет. Блок наконец используется для закрытия ресурсов и выполняет мероприятия по очистке.
def divide(x, y): try: print(f'{x}/{y} is {x / y}') except ZeroDivisionError as e: print(e) else: print("divide() function worked fine.") finally: print("close all the resources here") divide(10, 2) divide(10, 0) divide(10, 4)
Выход:
Синтаксис обработки исключений Python
Теперь, когда мы видели все, связанные с обработкой исключения в Python, последний синтаксис:
try -> except 1...n -> else -> finally
У нас может быть много блоков для блока попробовать. Но мы можем иметь только один и наконец-то блок.
Создание пользовательского класса исключений
Мы можем создать пользовательский класс исключения, расширяя класс исключения. Лучшая практика состоит в том, чтобы создать базовое исключение, а затем выводить другие классы исключения. Вот несколько примеров создания пользовательских классов исключения.
class EmployeeModuleError(Exception): """Base Exception Class for our Employee module""" pass class EmployeeNotFoundError(EmployeeModuleError): """Error raised when employee is not found in the database""" def __init__(self, emp_id, msg): self.employee_id = emp_id self.error_message = msg class EmployeeUpdateError(EmployeeModuleError): """Error raised when employee update fails""" def __init__(self, emp_id, sql_error_code, sql_error_msg): self.employee_id = emp_id self.error_message = sql_error_msg self.error_code = sql_error_code
Конвенция об именовании заключается в суффиксе имени класса исключения с «Ошибками».
Повышение исключений
Мы можем использовать ключевое слово «Поднять», чтобы бросить исключение из нашего кода. Некоторые из возможных сценариев:
- Валидация параметров ввода функций не удается
- Ловить исключение и затем бросать пользовательское исключение
class ValidationError(Exception): pass def divide(x, y): try: if type(x) is not int: raise TypeError("Unsupported type") if type(y) is not int: raise TypeError("Unsupported type") except TypeError as e: print(e) raise ValidationError("Invalid type of arguments") if y is 0: raise ValidationError("We can't divide by 0.") try: divide(10, 0) except ValidationError as ve: print(ve) try: divide(10, "5") except ValidationError as ve: print(ve)
Выход:
We can't divide by 0. Unsupported type Invalid type of arguments
Вложенные попробовать за исключением блоков пример
Мы можем вложить попробовать, кроме блоков в Python. В этом случае, если исключение поднимается в вложенном блоке TRY, вложенный кроме блока используется для обработки его. В случае, если вложенные за исключением не умеют обращаться с ним, внешние за исключением блоков используются для обработки исключения.
x = 10 y = 0 try: print("outer try block") try: print("nested try block") print(x / y) except TypeError as te: print("nested except block") print(te) except ZeroDivisionError as ze: print("outer except block") print(ze)
Выход:
outer try block nested try block outer except block division by zero
Python Exception Обращаясь за лучшие практики
- Всегда старайтесь обрабатывать исключение в коде, чтобы избежать ненормального завершения программы.
- При создании таможенного класса исключения суффикс его название с «ошибкой».
- Если кроме положения имеют тот же код, попробуйте поймать несколько исключений в одном кроме блока.
- Используйте, наконец, блокировать, чтобы закрыть тяжелые ресурсы и удалить тяжелые объекты.
- Используйте остальные блоки для журнала успешного выполнения кода, отправьте уведомления и т. Д.
- Избегайте как можно большего размера, кроме как можно больше. Если вы не знаете об исключениях, то только используйте его.
- Создание классов исключения для конкретных модулей для конкретных сценариев.
- Вы можете ловить исключения в за исключением блоке, а затем поднять еще одно исключение, что является более значимым.
- Всегда поднимайте исключения со значимыми сообщениями.
- Избегайте вложенных блоков, кроме слоев, потому что это уменьшает читаемость кода.