Python Academy · Oppitunti

Mukautetut poikkeusluokat

Määrittäkää omia poikkeustyyppejä virheiden selkeämpää välittämistä varten.

Oppitunti 4/414 vaihetta

Mukautetut poikkeusluokat on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Python Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Python Academy-kurssilla on yhteensä 4 oppituntia.

Johdanto

Mukautetut poikkeusluokat tekevät virheenkäsittelystä eksplisiittistä, itsensä dokumentoivaa ja kutsujille helposti täsmällisesti käsiteltävää.

Miksi mukautettuja poikkeuksia käytetään?

Sisäänrakennetut poikkeukset ovat liian yleisiä. Mukautettujen poikkeusten avulla kutsujat voivat käsitellä vain oman kirjastonne virheitä ja jättää toisiinsa liittymättömät virheet käsittelemättä.
class AppError(Exception):
    pass
raise AppError('something went wrong')

Exception-luokasta periminen

class MyError(Exception): pass riittää. Perikää aina Exception-luokasta, älkää BaseException-luokasta.
class ValidationError(Exception):
    pass
try:
    raise ValidationError('email is invalid')
except ValidationError as e:
    print(e)

Mukautettujen määritteiden lisääminen

class APIError(Exception): def __init__(self, status, message): self.status = status; super().__init__(message)
class APIError(Exception):
    def __init__(self, status, message):
        self.status = status
        super().__init__(message)
try:
    raise APIError(404, 'Not found')
except APIError as e:
    print(e.status, e)

Poikkeushierarkia

Rakentakaa hierarkia: class DBError(AppError): pass — kutsujat voivat käsitellä kaikkia sovelluksen virheitä AppError-luokan avulla tai vain DBError-poikkeuksia erikseen.
class AppError(Exception): pass
class DBError(AppError): pass
class NetworkError(AppError): pass
try:
    raise DBError('timeout')
except AppError as e:
    print('app error:', e)

Mukautettu __str__-metodi

Ohittakaa __str__, jos haluatte hallita sitä, miltä poikkeusviesti näyttää tulostettaessa.
class RangeError(ValueError):
    def __init__(self, val, lo, hi):
        self.val, self.lo, self.hi = val, lo, hi
    def __str__(self):
        return f'{self.val} not in [{self.lo}, {self.hi}]'
print(RangeError(15, 0, 10))

Mukautettujen poikkeusten nostaminen

Ilmoittakaa toimialakohtaisista virheistä käyttämällä raise-lauseita funktioissanne. Näin kutsujille muodostuu selkeä rajapinta.
class InsufficientFundsError(Exception):
    def __init__(self, needed, available):
        super().__init__(f'Need {needed}, have {available}')
def withdraw(balance, amount):
    if amount > balance:
        raise InsufficientFundsError(amount, balance)
    return balance - amount
try:
    withdraw(100, 200)
except InsufficientFundsError as e:
    print(e)

Käsitteleminen perusluokan perusteella

except AppError käsittelee kaikki aliluokat, kuten DBError- ja NetworkError-poikkeukset. Hierarkian ansiosta kutsujat voivat valita käsittelyn tarkkuuden.
class AppError(Exception): pass
class DBError(AppError): pass
try:
    raise DBError('conn failed')
except AppError:
    print('any app error')

Poikkeus kontekstinhallinnan kanssa

Mukautetut poikkeukset toimivat myös kontekstinhallinnan kanssa: class suppressed: __exit__ returns True estää poikkeuksen etenemisen.
class SuppressValue(Exception): pass
try:
    raise SuppressValue('ignored')
except SuppressValue:
    pass  # suppress silently
print('continued')

Mukautettujen poikkeusten dokumentointi

Dokumentoikaa, MILLOIN poikkeus nostetaan ja MITÄ sen määritteet tarkoittavat. Hyvät dokumenttimerkkijonot tekevät mukautetuista poikkeuksista helposti käytettäviä.
class ConfigError(Exception):
    """Raised when configuration is invalid.
    Attributes:
        key: The invalid config key
    """
    def __init__(self, key, msg):
        super().__init__(msg)
        self.key = key

Parhaat käytännöt

Pitäkää hierarkia matalana (2–3 tasoa). Perikää aina Exception-luokasta. Käyttäkää kuvaavia, Error-päätteisiä nimiä. Sijoittakaa poikkeukset erilliseen exceptions.py-moduuliin.
# Good structure:
class AppError(Exception): pass
class ValidationError(AppError): pass
class NotFoundError(AppError): pass
print('hierarchy demo')

Pikatarkistus

Mistä luokasta mukautettujen poikkeusten tulee periä, jotta järjestelmän sammuttavat tapahtumat eivät jää kiinni?

Kertaus

Mukautetut poikkeukset perivät Exception-luokasta, saavat määritteet __init__-metodissa ja voivat ylikirjoittaa __str__-metodin. Rakentakaa hierarkioita, jotta poikkeukset voidaan käsitellä halutulla tarkkuudella. Sijoittakaa ne exceptions.py-moduuliin.

Jatkakaa eteenpäin

Hienosti tehty! Siirtykää seuraavaan oppituntiin jatkaaksenne etenemistä.
Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
76
Oppitunnit
320

Usein kysytyt kysymykset

Onko oppitunti ”Mukautetut poikkeusluokat” ilmainen?

Kyllä – oppitunnin ”Mukautetut poikkeusluokat” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Python Academy-kurssin, päivitä CoddyKit PROhon. Python Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Mukautetut poikkeusluokat”?

Määrittäkää omia poikkeustyyppejä virheiden selkeämpää välittämistä varten. Harjoittelet Python Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Python Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Python Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Mukautetut poikkeusluokat”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Python Academy-oppitunnilla?

Kyllä. Jokainen Python Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Poikkeusten ymmärtäminen
  2. try / except / else / finally
  3. Poikkeusten nostaminen ja uudelleennostaminen
  4. Mukautetut poikkeusluokat
← Takaisin: Python Academy