0Pricing
Python Academy · Lekcja

Zgłaszanie i ponowne zgłaszanie wyjątków

Proszę używać raise do sygnalizowania błędów oraz ponownie zgłaszać wyjątki w celu ich propagacji.

Zgłaszanie i ponowne zgłaszanie wyjątków to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.

Wprowadzenie

Słowo kluczowe raise umożliwia jawne sygnalizowanie błędów. Ponowne zgłoszenie wyjątku zachowuje jego pierwotny kontekst.

raise z wbudowanym wyjątkiem

raise ValueError('message') natychmiast zgłasza wyjątek tego typu z podanym komunikatem.
def divide(a, b):
    if b == 0:
        raise ValueError('Denominator cannot be zero')
    return a / b
try:
    divide(5, 0)
except ValueError as e:
    print(e)

Ponowne zgłaszanie tego samego wyjątku

W bloku except instrukcja raise (bez argumentu) ponownie zgłasza bieżący wyjątek, zachowując jego pierwotny traceback.
def process(data):
    try:
        return int(data)
    except ValueError:
        print('logging error')
        raise  # re-raises original
try:
    process('abc')
except ValueError:
    print('caller caught it')

Łączenie wyjątków za pomocą from

raise NewError('msg') from original łączy wyjątki. Atrybut exc.__cause__ zostaje ustawiony.
try:
    int('abc')
except ValueError as original:
    raise RuntimeError('processing failed') from original

Wyłączanie łączenia wyjątków

raise NewError() from None przerywa łańcuch — pierwotny wyjątek zostaje ukryty w tracebacku.
try:
    int('abc')
except ValueError:
    raise RuntimeError('clean error') from None

Instrukcja assert

assert condition, 'message' zgłasza AssertionError, jeśli condition ma wartość False. Należy jej używać wyłącznie do sprawdzania niezmienników podczas tworzenia programu.
def sqrt(x):
    assert x >= 0, f'Input must be non-negative, got {x}'
    return x ** 0.5
try:
    sqrt(-1)
except AssertionError as e:
    print(e)

Warunkowe zgłaszanie wyjątku

Klauzule ochronne z raise na początku funkcji jasno określają warunki wstępne i pozwalają uniknąć głębokiego zagnieżdżania.
def process(items):
    if not items:
        raise ValueError('items must not be empty')
    return items[0]
print(process([1, 2, 3]))

Ponowne zgłoszenie a nowy wyjątek

Ponowne zgłoszenie (puste raise) zachowuje kontekst. Nowy wyjątek go ukrywa. Aby zachować widoczność obu wyjątków, należy użyć łączenia.
def outer():
    try:
        inner()
    except ValueError as e:
        raise RuntimeError('outer failed') from e
def inner():
    raise ValueError('inner failed')
try:
    outer()
except RuntimeError as e:
    print(e, e.__cause__)

Wyjątek w finally

Zgłoszenie wyjątku w finally zastępuje pierwotny wyjątek. Należy unikać zgłaszania wyjątków w finally, chyba że jest to absolutnie konieczne.
try:
    try:
        raise ValueError('original')
    finally:
        print('finally ran')
except ValueError as e:
    print('caught:', e)

warnings.warn a raise

warn() służy do odzyskiwalnych, niekrytycznych błędów, a raise do błędów, które muszą zostać obsłużone. Służą do różnych celów.
import warnings
def old_func():
    warnings.warn('Deprecated', DeprecationWarning)
    return 42
print(old_func())

Wzorzec raise from None

Podczas opakowywania wyjątków biblioteki we własne wyjątki API należy użyć from None, aby uniknąć ujawniania szczegółów implementacji.
class DBError(Exception): pass
def query(q):
    try:
        raise ConnectionError('refused')
    except ConnectionError:
        raise DBError('query failed') from None
try:
    query('SELECT 1')
except DBError as e:
    print(e)

Szybkie sprawdzenie

Co robi instrukcja 'raise' (bez argumentu) wewnątrz bloku except?

Podsumowanie

raise Type('msg') sygnalizuje błędy. Puste raise ponownie zgłasza wyjątek. raise New from Old łączy wyjątki. raise New from None ukrywa kontekst. assert służy do sprawdzania niezmienników podczas tworzenia programu.

Kontynuuj naukę

Świetna praca! Przejdź do następnej lekcji, aby kontynuować naukę.

Często zadawane pytania

Czy lekcja „Zgłaszanie i ponowne zgłaszanie wyjątków” jest bezpłatna?

Tak — pełny tekst „Zgłaszanie i ponowne zgłaszanie wyjątków” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Zgłaszanie i ponowne zgłaszanie wyjątków”?

Proszę używać raise do sygnalizowania błędów oraz ponownie zgłaszać wyjątki w celu ich propagacji. Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Python Academy?

Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Zgłaszanie i ponowne zgłaszanie wyjątków”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?

Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Zrozumienie wyjątków
  2. try / except / else / finally
  3. Zgłaszanie i ponowne zgłaszanie wyjątków
  4. Niestandardowe klasy wyjątków
← Powrót do Python Academy