Permalänk
Medlem

Python except Exception, e:

Tjenare,except Exception, e: kommer från python 2 och jag ville skriva denna kod i python 3 och fick självklart error, men min underbara pyCharm fixade detta åt mig och gav mig istället except Exception as e:

except Exception as e: pass

men skulle någon vänlig själ kunna förklara lite smått vad detta gör? except Exception as e: pass alltså.

Permalänk
Hedersmedlem

(Varför ville du skriva koden om du inte visste vad den gjorde? )

Handling exceptions [Python-manualen] visar `try`/`except`-syntaxen. I `try`-blocket kör du kod, och ifall den "höjer" ett undantag under körning så kan du "fånga" det med `except` och då köra detta block. Ett undantag som inte fångas avbryter programkörningen med en "traceback", som du säkert sett under dina tester.

Just `Exception` är en basklass som alla undantag "ska" ärva ifrån (alla inbyggda gör det, om du skriver egna undantag så är det ditt ansvar, i någon mån). I ditt kodexempel så betyder det i praktiken att alla undantag fångas. Det undantag som fångats ges sedan variabelnamnet `e` i `except`-blocket. Skriver du ut `e` med exempelvis `print(e)` så får du helt enkelt texten tillhörande undantaget:

>>> try: ... print(finns_ej) ... except NameError as e: ... print('Fel: {}'.format(e)) ... Fel: name 'finns_ej' is not defined

Ovan så visar jag hur man fångar ett explicit namngivet undantag: det ska man i praktiken alltid göra (ett eller flera, men inte "wildcard", så att säga). Det är ytterst dålig praxis att fånga "allt", för då är det väldigt lätt att man döljer oväntade fel och gör felsökning till en ren pärs. Om man inte vet vilka undantag man vill fånga så har man gjort något fel.

`pass` är en "no-op", dvs ett "statement" som inte gör någonting. Det måste stå något för att inte Pythontolken ska klaga på att det inte finns något indenterat blockinnehåll i ditt exempel, men det gör alltså "ingenting".

Sammantaget så fångar din kod alltså alla undantag som ärvt från `Exception` (vilket bör vara just alla undantag) och gör ingenting med dem, utan låter koden fortsätta utan avbrott. Detta gör att alla undantag som höjs av koden i motsvarande `try`-block bara kastas bort. Värdelös praxis, gör aldrig så, men det kanske bara var i pedagogiskt syfte .

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem
Skrivet av phz:

(Varför ville du skriva koden om du inte visste vad den gjorde? )

Handling exceptions [Python-manualen] visar `try`/`except`-syntaxen. I `try`-blocket kör du kod, och ifall den "höjer" ett undantag under körning så kan du "fånga" det med `except` och då köra detta block. Ett undantag som inte fångas avbryter programkörningen med en "traceback", som du säkert sett under dina tester.

Just `Exception` är en basklass som alla undantag "ska" ärva ifrån (alla inbyggda gör det, om du skriver egna undantag så är det ditt ansvar, i någon mån). I ditt kodexempel så betyder det i praktiken att alla undantag fångas. Det undantag som fångats ges sedan variabelnamnet `e` i `except`-blocket. Skriver du ut `e` med exempelvis `print(e)` så får du helt enkelt texten tillhörande undantaget:

>>> try: ... print(finns_ej) ... except NameError as e: ... print('Fel: {}'.format(e)) ... Fel: name 'finns_ej' is not defined

Ovan så visar jag hur man fångar ett explicit namngivet undantag: det ska man i praktiken alltid göra (ett eller flera, men inte "wildcard", så att säga). Det är ytterst dålig praxis att fånga "allt", för då är det väldigt lätt att man döljer oväntade fel och gör felsökning till en ren pärs. Om man inte vet vilka undantag man vill fånga så har man gjort något fel.

`pass` är en "no-op", dvs ett "statement" som inte gör någonting. Det måste stå något för att inte Pythontolken ska klaga på att det inte finns något indenterat blockinnehåll i ditt exempel, men det gör alltså "ingenting".

Sammantaget så fångar din kod alltså alla undantag som ärvt från `Exception` (vilket bör vara just alla undantag) och gör ingenting med dem, utan låter koden fortsätta utan avbrott. Detta gör att alla undantag som höjs av koden i motsvarande `try`-block bara kastas bort. Värdelös praxis, gör aldrig så, men det kanske bara var i pedagogiskt syfte .

(efter exit(0) så behövdes en except eller finally, och eftersom jag inte riktigt vet vad jag gör så hamnade jag här )

Grymt förklarat, indenteringen vart lite offside, men den är rätt i programmet!
EDIT: Japp, pedagogiskt syfte!