Kasutaja loodud erinditüübid

Erind on objekt, mis kannab endaga kaasas täiendavat infot:

  • klassi nimi (tavaliselt annab see juba infot, mis probleem võis tekkida, nt IndexError)

  • erindi teade (message, tekkepõhjus, täpsustus vms)

  • erindi tekkimise koht (fail, rida)

  • kogu eelnenud programmi kutsungite ahel (mis meetod kutsus välja meetodi, kus erind tekkis jne), ingl k stack trace.

Vaatame üht näidet, kus kasutaja loodud erinditüübid aitavad tõstatada ja püüda vigu.

Alljärgnev programm palub kasutajal sisestada numbreid, kuni nad arvavad eelnevalt salvestatud numbri õigesti ära. Selleks, et kasutajate elu lihtsamaks teha, tagastatakse vihje, kas pakutud number on suurem või väiksem kui salvestatud number.

 1    # Define Python user-defined exceptions
 2    class Error(Exception):
 3        """Base class for other exceptions"""
 4        pass
 5
 6
 7    class ValueTooSmallError(Error):
 8        """Raised when the input value is too small"""
 9        pass
10
11
12    class ValueTooLargeError(Error):
13        """Raised when the input value is too large"""
14        pass
15
16
17    # You need to guess this number
18    number = 10
19
20    # User guesses a number until he/she gets it right
21    while True:
22        try:
23            i_num = int(input("Enter a number: "))
24            if i_num < number:
25                raise ValueTooSmallError
26            elif i_num > number:
27                raise ValueTooLargeError
28            break
29        except ValueTooSmallError:
30            print("This value is too small, try again!")
31        except ValueTooLargeError:
32            print("This value is too large, try again!")
33
34    print("Congratulations! You guessed it correctly.")

Allpool on toodud võimalik väljund:

Enter a number: 12
This value is too large, try again!

Enter a number: 0
This value is too small, try again!

Enter a number: 8
This value is too small, try again!

Enter a number: 10
Congratulations! You guessed it correctly.

Nii luuakse uus alamklass Error (mis laiendab sisseehitatud Exception klassi) ning uut tüüpi erindid ValueTooSmallError ja ValueTooLargeError, mis laiendavad meie loodud Error klassi. Loodud uuele tüübile me mingit sisu lisada ei taha (ta pärib kõik Exception klassi meetodid ja muutujad). Kuna Pythonis me klassi kirjeldust tühjaks ei saa jätta, lisame sinna võtmesõna pass.

See on tavapärane viis Pythoni programmeerimiskeeles määratleda kasutaja poolt loodud erindeid, kuid neid võimalusi on veelgi (lisada argumente, sõnumeid ja muud).