Ланцюжок Виключень та Повторне Підняття
Свайпніть щоб показати меню
Під час обробки помилок у Python може виникнути ситуація, коли перехоплення одного винятку призводить до необхідності згенерувати інший виняток. У таких випадках важливо зберегти контекст початкової помилки. Механізм ланцюжка винятків у Python дозволяє це зробити за допомогою ключового слова from. Явне ланцюжкування винятків забезпечує більш детальні трасування, що полегшує розуміння послідовності помилок, які призвели до збою.
Припустимо, ви пишете функцію для обробки вхідних даних з файлу. Якщо під час читання файлу виникає помилка, можливо, ви захочете згенерувати власний виняток, який краще відповідає логіці вашого застосунку, але при цьому зберегти інформацію про початкову помилку. Використання raise NewException() from original_exception дозволяє зробити саме це.
Повторне підняття винятків — ще одна пов’язана техніка. Іноді після перехоплення винятку потрібно виконати певне очищення або логування, а потім дозволити винятку поширитися далі. Це можна зробити, просто використавши raise без зазначення винятку, що повторно піднімає останній перехоплений виняток. Обидва підходи — ланцюжкування та повторне підняття винятків — є цінними для написання надійного та зручного для налагодження коду.
12345678910111213141516# Simple exception chaining and re-raising example def divide(a, b): try: return a / b except ZeroDivisionError as err: # Chain a new exception to the original raise ValueError("Cannot divide by zero") from err try: divide(5, 0) except ValueError as e: print("Caught ValueError:") import traceback traceback.print_exc() print("\nRe-raising the exception...\n") raise
Цей код демонструє просте ланцюжкування та повторне підняття винятків у Python. Функція divide намагається поділити два числа та перехоплює ZeroDivisionError, ланцюжкує його з новим ValueError із зрозумілим повідомленням. Зовнішній блок try-except перехоплює ValueError, виводить повну трасування з обома винятками, а потім повторно піднімає виняток для подальшого поширення.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат