В этой статье мы увидим, как мы можем использовать последнюю функцию Python 3.11, группы исключений. Чтобы использовать ExceptionGroup, вы должны быть знакомы с обработкой исключений в Python. Как следует из самого названия, это набор/группа различных видов исключений. Не создавая Множественных исключений, мы можем сгруппировать различные исключения, которые мы можем позже извлекать одно за другим, когда это необходимо, порядок, в котором исключения хранятся в группе исключений, не имеет значения при их вызове.
ПРИМЕЧАНИЕ. Если на устройстве пользователя не установлен Python 3.11, это не сработает.
Syntax: ExceptionGroup(“<User_Message/Description>”,[<SubException1(“exception message”)>,
<SubException2(“exception message”)>,…. <SubExceptionN(“exception message”)>])
Параметр: ExceptionGroup принимает два параметра.
- First_Parameter— сообщение/описание того, какие исключения будут храниться, или что-либо, что пользователь хочет написать там в качестве сообщения группы исключений.
- Second_Parameter— любое количество дополнительных исключений, которые пользователь хочет сохранить вместе с соответствующими сообщениями.
Пример
Как видите, даже несмотря на то, что мы создали функцию exceptionGroup(), мы не возвращаем никакого значения, а вместо того, чтобы поднимать переменную, в которой мы храним ExceptionGroup, потому что, как мы знаем, в случае обработки исключения мы возбуждаем Исключение. Теперь давайте создадим группу исключений и посмотрим, как она работает.
Python3
def
exceptionGroup():
exec_gr
=
ExceptionGroup(
'ExceptionGroup Message!'
,
[FileNotFoundError(
"This File is not found"
),
ValueError(
"Invalid Value Provided"
),
ZeroDivisionError(
"Trying to divide by 0"
)])
raise
exec_gr
Что произойдет, если мы вызовем эту функцию?
Пользователи получат структурированное сообщение об ошибке нового типа, в котором четко указано количество подисключений, которые у нас есть в группе исключений, с соответствующими сообщениями.
Python3
exceptionGroup()
Вывод:
Теперь заключите их в блок try-except Python.
Во фрагменте мы используем традиционный метод блока try-except и вызываем всю группу исключений в блоке исключений и печатаем все сообщения Sub Exception, которые у нас есть внутри него. Это даст следующий результат.
Python3
try
:
exceptionGroup()
except
ExceptionGroup as eg:
(eg.exceptions)
Вывод
Приведенный выше фрагмент вернет следующий вывод, он просто печатает все подисключения и их сообщения в форме кортежа.
Обработка одного исключения из группы исключений
Существует еще один отличный способ обработки подисключений по одному, не обрабатывая их все вместе, как в вышеупомянутом традиционном методе. Для этого есть новый синтаксис — exclude*, который используется именно с ExceptionGroup.
except* <ExceptionName> as <any_alias>: print(<any_alias>.exception)
Пример
Python3
try
:
exceptionGroup()
except
*
FileNotFoundError as fnf:
(fnf.exceptions)
except
*
ValueError as ve:
(ve.exceptions)
except
*
ZeroDivisionError as zde:
(zde.exceptions)
Вывод:
Как мы видим, отображаются все исключения и соответствующие сообщения об ошибках. Теперь, если мы хотим только печатать сообщения, нам нужно написать код, как показано ниже:
Python3
# only one except part is given here, the try block would be same.
# the way of printing the rest of the except blocks will be same also
except
*
FileNotFoundError as fnf:
for
err
in
fnf.exceptions:
(err)
Вывод:
Если мы обрабатываем только одно исключение, но существует более одного необработанного исключения, мы получим следующий результат:
Как мы видим, Python предоставит нам имена необработанных исключений и их сообщения в структурированном виде.
Вложенная группа исключений
У нас может быть ExceptionGroup внутри ExceptionGroup, т.е. вложенной группы исключений. Мы получим этот удивительный структурированный вывод, который ясно расскажет нам о нашей вложенной группе исключений наряду с нашей реальной группой исключений.
Python3
# defining the exception group function with a Nested exception group
def
exceptionGroup():
exec_gr
=
ExceptionGroup(
'ExceptionGroup Message!'
,
[FileNotFoundError(
"This File is not found"
),
ValueError(
"Invalid Value Provided"
),
ZeroDivisionError(
"Trying to divide by 0"
),
ExceptionGroup(
"This is a Nested ExceptionGroup"
,
[IndentationError(
"Please check your Indentation"
),
SyntaxError(
"there is a error in the syntax"
),
ImportError(
"Module Not Found"
)])])
raise
exec_gr
# calling the function
exceptionGroup()
Вывод: