Try внутри try python

Обработка исключений Python

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

10/2 is 5.0 Traceback (most recent call last): File "/Users/pankaj/Documents/PycharmProjects/PythonTutorialPro/hello-world/exception_handling.py", line 6, in divide(10, 0) File "/Users/pankaj/Documents/PycharmProjects/PythonTutorialPro/hello-world/exception_handling.py", line 2, in divide print(f'/ is ') ZeroDivisionError: division by zero

Второй вызов функции div() вызвал исключение ZeroDivisionError, и программа завершилась.

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

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

def divide(x, y): try: print(f'/ is ') 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

Обработка Исключений Python

Что такое класс BaseException?

Класс BaseException — это базовый класс всех исключений. Он имеет четыре подкласса.

  1. Исключение-это базовый класс для всех исключений, не связанных с выходом.
  2. GeneratorExit-запрос на выход генератора.
  3. KeyboardInterrupt-программа, прерванная пользователем.
  4. SystemExit-запрос на выход из интерпретатора.

Встроенные классы исключений

Вот некоторые из встроенных классов исключений в Python:

  • ArithmeticError — это базовый класс для арифметических ошибок.
  • AssertionError — возникает, когда утверждение не выполняется.
  • AttributeError — когда атрибут не найден.
  • BufferError
  • EOFError — чтение после конца файла
  • ImportError — когда импортированный модуль не найден.
  • LookupError — базовое исключение для ошибок поиска.
  • MemoryError — при нехватке памяти
  • NameError — когда имя не найдено глобально.
  • OSError — базовый класс для ошибок ввода-вывода
  • ReferenceError
  • Ошибка выполнения
  • StopIteration, StopAsyncIteration
  • SyntaxError — недопустимый синтаксис
  • SystemError — внутренняя ошибка интерпретатора Python.
  • TypeError — недопустимый тип аргумента
  • ValueError — недопустимое значение аргумента

Встроенные классы предупреждений

Класс Warning — это базовый класс для всех предупреждений. Он имеет следующие подклассы.

  • BytesWarning — предупреждения, связанные с байтами и буфером, в основном связанные с преобразованием и сравнением строк.
  • DeprecationWarning — предупреждение об устаревших функциях
  • FutureWarning — базовый класс для предупреждения о конструкциях, которые будут семантически изменяться в будущем.
  • ImportWarning — предупреждение об ошибках при импорте модулей
  • PendingDeprecationWarning — предупреждение о функциях, поддержка которых в будущем будет прекращена.
  • ResourceWarning — предупреждения об использовании ресурсов
  • RuntimeWarning — предупреждения о сомнительном поведении во время выполнения.
  • SyntaxWarning — предупреждение о сомнительном синтаксисе
  • UnicodeWarning — предупреждения, связанные с преобразованием Unicode
  • UserWarning — предупреждения, генерируемые кодом пользователя
Читайте также:  Edostavka ru contacts city list html

Обработка нескольких исключений в одном блоке Except

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

def divide(x, y): try: print(f'/ is ') except ZeroDivisionError as e: print(e) except TypeError as e: print(e) except ValueError as e: print(e)

Код в каждом блоке except одинаковый. В этом сценарии мы можем обрабатывать несколько исключений в одном блоке except. Мы можем передать кортеж объектов исключения в блок except, чтобы поймать несколько исключений.

def divide(x, y): try: print(f'/ is ') except (ZeroDivisionError, TypeError, ValueError) as e: print(e)

Поймать все исключения в блоке с одним исключением

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

Пустое предложение except должно быть последним.

def divide(x, y): try: print(f'/ is ') except ZeroDivisionError as e: print(e) except: print("unknown error occurred")

Использование else Block с try-except

Код блока else не является обязательным. Он выполняется, когда нет исключений, вызванных блоком try.

def divide(x, y): try: print(f'/ is ') except ZeroDivisionError as e: print(e) else: print("divide() function worked fine.") divide(10, 2) divide(10, 0) divide(10, 4)

Try Except Else пример

Код блока else выполняется дважды, когда блок try функции div() работал без каких-либо исключений.

Использование finally Block с try-except

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

def divide(x, y): try: print(f'/ is ') 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)

Try Except Else Finally блок

Синтаксис

окончательный синтаксис таков:

try -> except 1. n -> else -> finally

У нас может быть много блоков except для блока try. Но у нас может быть только еще один else, finally блок.

Создание настраиваемого класса исключения

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

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

По соглашению об именах к имени класса исключения добавляется суффикс «Ошибка».

Вызов исключений

Мы можем использовать ключевое слово raise, чтобы генерировать исключение из нашего кода. Некоторые из возможных сценариев:

  • Ошибка проверки входных параметров функции;
  • Поймать исключение и затем выбросить собственное.
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

Пример вложенных блоков try-except

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

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

Советы

  • Всегда пытайтесь обработать исключение в коде, чтобы избежать аварийного завершения программы.
  • При создании настраиваемого класса исключения добавьте к его имени суффикс «Error».
  • Если в предложениях except одинаковый код, попробуйте перехватить несколько исключений в одном блоке except.
  • Используйте блок finally, чтобы закрыть тяжелые ресурсы.
  • Используйте блок else для регистрации успешного выполнения кода, отправки уведомлений и т. д.
  • По возможности избегайте голых исключений.
  • Создавайте классы исключений для конкретных модулей для конкретных сценариев.
  • Вы можете перехватить исключения в блоке except, а затем вызвать другое, которое будет более значимым.
  • Всегда вызывайте с осмысленными сообщениями.
  • Избегайте вложенных блоков try-except, потому что это снижает читаемость кода.
Читайте также:  Python elasticsearch search timeout

Источник

Nested try-except-finally blocks in Python

Nested try-except-finally blocks in Python

  1. Nested try-except-finally blocks in Python
  2. Different cases and scenarios
  3. Else Block in Python
  4. Possible Combinations with try-except-else-finally
Nested try-except-finally blocks in Python

In python nested try except finally blocks are allowed. We can take try-except-finally blocks inside try block. We can take try-except-finally blocks inside except block. We can take try-except-finally blocks inside finally block

Different cases and scenarios

Case 1: If no exception raised then outer try, inner try, inner finally, outer finally blocks will get executed

Program: demo28.py

try: print("outer try block") try: print("Inner try block") except ZeroDivisionError: print("Inner except block") finally: print("Inner finally block") except: print("outer except block") finally: print("outer finally block")

If no exception raised then outer try, inner try, inner finally, outer finally blocks will get executed

Case 2:

If an exception is raised in an outer try, then outer except blocks are responsible to handle that exception.

Program: demo29.py

try: print("outer try block") print(10/0) try: print("Inner try block") except ZeroDivisionError: print("Inner except block") finally: print("Inner finally block") except: print("outer except block") finally: print("outer finally block")

If an exception is raised in an outer try, then outer except blocks are responsible to handle that exception.

Case 3:

If an exception raised in inner try block then inner except block is responsible to handle, if it is unable to handle then outer except block is responsible to handle.

Program: Exception handled by inner except block (demo30.py)

try: print("outer try block") try: print("Inner try block") print(10/0) except ZeroDivisionError: print("Inner except block") finally: print("Inner finally block") except: print("outer except block") finally: print("outer finally block")

Nested try-except-finally blocks in Python

Program: Exception handled by outer except block (demo31.py)

try: print("outer try block") try: print("Inner try block") print(10/0) except NameError: print("Inner except block") finally: print("Inner finally block") except: print("outer except block") finally: print("outer finally block")

Nested try-except-finally blocks in Python with Examples

Else Block in Python:

We can use else blocks with try-except-finally blocks. The else block will be executed if and only if there are no exceptions inside the try block.

Читайте также:  Python dict добавить элемент

Note: If no exception then try, else and finally blocks will get executed. If an exception is raised inside the try block, then the except block will get executed but the else block won’t.

Program: else block (demo32.py)

try: print("try block") except: print("except: Handling code") else: print("else block") finally: print("finally block")

Else Block in Python

Program: else block (demo33.py)

try: print("try block") print(10/0) except: print("except: Handling code") else: print("else block") finally: print("finally block")

Else Block in Python

Possible Combinations with try-except-else-finally

Only try block is invalid, only except block is invalid, only finally block is invalid

Program: only try block (demo33.py)

only try block

Output:

Program: only except block (demo34.py)

except: print("except: Handling code")

only except block

Output:

Program: Only Finally block (demo35.py)

finally: print("finally block")

Output:

Note:
  1. try with except combination is valid → try block follows except block
  2. try with finally combination is valid → try block follows finally block
  3. try, except and else combination is valid → try, except blocks follows else block

Program: try with except combination (demo36.py)

try: print("try block") except: print("except: Handling code")

try with except combination

Output:

Program: try with finally combination (demo37.py)

try: print("try block") finally: print("finally block")

try with finally combination

Program: try, except and else combination (demo38.py)

try: print("try block") except: print("except: Handling code") else: print("else block")

try, except and else combination

In the next article, I am going to discuss Custom Exceptions in Python with Examples. Here, in this article, I try to explain Nested try-except-finally blocks in Python with Examples. I hope you enjoy this Nested try-except-finally blocks in Python article. I would like to have your feedback. Please post your feedback, question, or comments about this article.

Источник

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