Python Academy · leksjon

Utløse og utløse unntak på nytt

Bruk raise til å signalisere feil, og utløs unntak på nytt for å føre dem videre.

Leksjon 3 av 414 trinn

Utløse og utløse unntak på nytt er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Python Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Python Academy inneholder totalt 4 leksjoner.

Introduksjon

Nøkkelordet raise lar Dem signalisere feil eksplisitt. Når De utløser unntaket på nytt, bevares den opprinnelige feilens kontekst.

raise for innebygd unntak

raise ValueError('message') utløser umiddelbart denne unntakstypen med den angitte meldingen.
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)

Utløse det samme unntaket på nytt

Inne i except utløser raise (uten argument) det gjeldende unntaket på nytt og bevarer den opprinnelige tracebacken.
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')

Kjeding av unntak med from

raise NewError('msg') from original kjeder sammen unntakene. exc.__cause__ settes.
try:
    int('abc')
except ValueError as original:
    raise RuntimeError('processing failed') from original

Undertrykke kjeding

raise NewError() from None bryter kjeden – det opprinnelige unntaket skjules i tracebacken.
try:
    int('abc')
except ValueError:
    raise RuntimeError('clean error') from None

assert-setningen

assert condition, 'message' utløser AssertionError hvis condition er False. Bruk den bare for invarianter under utvikling.
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)

Betinget raise

Vaktklausuler med raise øverst i en funksjon gjør forhåndsbetingelser tydelige og unngår dyp nesting.
def process(items):
    if not items:
        raise ValueError('items must not be empty')
    return items[0]
print(process([1, 2, 3]))

Utløse på nytt kontra nytt unntak

Utløsing på nytt (bare raise) bevarer konteksten. Et nytt unntak skjuler den. Bruk kjeding for å beholde begge synlige.
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__)

Unntak i finally

Et unntak som utløses i finally, erstatter det opprinnelige unntaket. Unngå å utløse unntak i finally med mindre det er absolutt nødvendig.
try:
    try:
        raise ValueError('original')
    finally:
        print('finally ran')
except ValueError as e:
    print('caught:', e)

warnings.warn kontra raise

Bruk warn() for håndterbare, ikke-kritiske feil og raise for feil som må håndteres. De har ulike formål.
import warnings
def old_func():
    warnings.warn('Deprecated', DeprecationWarning)
    return 42
print(old_func())

Mønsteret raise from None

Når De pakker inn bibliotekunntak i egne API-unntak, bruker De from None for å unngå å lekke interne detaljer.
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)

Hurtigsjekk

Hva gjør 'raise' (uten argument) inne i en except-blokk?

Oppsummering

raise Type('msg') signaliserer feil. Bare raise utløser det gjeldende unntaket på nytt. raise New from Old kjeder sammen unntak. raise New from None undertrykker konteksten. Bruk assert for invarianter under utvikling.

Fortsett

Godt jobbet! Gå videre til neste leksjon for å fortsette fremgangen.
Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
76
Leksjoner
320

Ofte stilte spørsmål

Er leksjonen «Utløse og utløse unntak på nytt» gratis?

Ja – hele teksten i «Utløse og utløse unntak på nytt» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Python Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Python Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Utløse og utløse unntak på nytt»?

Bruk raise til å signalisere feil, og utløs unntak på nytt for å føre dem videre. Du øver på Python Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Python Academy?

Ingen tidligere erfaring er nødvendig. Python Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Utløse og utløse unntak på nytt»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Python Academy-leksjonen?

Ja. Alle Python Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Forstå unntak
  2. try / except / else / finally
  3. Utløse og utløse unntak på nytt
  4. Egendefinerte unntaksklasser
← Tilbake til Python Academy