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).