Yangi istisnolarni ishlab chiqish Yuqoridagi jadvalida ko’rsatilgan barcha istisnolar klasslar shaklida aniqlangan. Shuningdek, Python tilida ehtiyojga ko’ra yangi istisnolarni yaratish mexanizmi ham ko’zda tutilgan.
Yangi istisnolarni ishlan chiqish uchun Exception klassining vorisi bo’lgan yangi klassni e’lon qilish lozim. Bu jarayonni quyidagicha ifogalash mumkin:
class NetworkError(Exception): pass Yangi istisno qilinadigan vaziyatdan amalda foydalanish uchun uni raise operatoriga uzatish kerak. Masalan:
raise NetworkError(“Kompyuterni tarmoqda topib bo’lmadi.”) Istisno qilinadigan vaziyatlar raise yordamida qo’zg’otilganda klass nazoratchisiga (instruktoriga) qo’shimcha qiymat uzatilishi mumkin. Odatda bu yuzaga keladigan hatolik haqidagi ma’lumot-matndan iborat bo’ladi. Shunday bo’lsada, yangi istisnolar quyidagi namuna kabi bir yoki bir nechta qiymatlarni qabul qilishi mumkin:
class DeviceError(Exception): def __init(self, yerrno, msg): self.args = (errno, msg) self.d yerrno = yerrno self.errmsg = msg # istisnoli vaziyatni (bir nechta parametrni uzatib) qo’zg’otish raise DeviceError(1, “Javob yo’q”) _init() metodini qayta aniqlash orqali yangi istisnoni yaratishda metodning argumentlarini o’z ichiga oluvchi kortejni self.args attributiga o’zlashtirib qo’yishni unutmaslik lozim. Bu attribut hatolikka mos axborotni ekranga uzatishda foydalaniladi. Agar attribut bo’sh qoldirilsa ekranga hech narda chiqarilmaydi va yuzaga keladigan hatolik haqidagi ma’lumotni foydalanuvchilar ko’ra olmaydilar.
Istisnolarni vorislik mexanizmi asosida shajarasimon tashkil qilish mumkin. Masalan, yuqorida aniqlangan NetworkError o’ziga hos boshqa istisnolar uchun bazaviy klass bo’lib xizmat qilishi mumkin:
class HostnameError(NetworkError): pass class TimeoutError(NetworkError): pass def yerror1(): raise HostnameError(“Xost topilmadi”) def yerror2(): raise TimeoutError(“kutish vaqti ortib ketdi”) try: error1() except NetworkError as e: if type(e) is HostnameError: # Shu tipdagi hatolikka mos amallarbni bajarish ... Bu holda NetworkError klassining vorisi bo’lgan except NetworkError buyrug’i barcha istisno qilinadigan vaziyatlarni tutib qoladi. Yuzaga kelgan hatolik tipini aniqlash uchun type(), sodir bo’lgan oxirgi istisnoli vaziyat haqidagi axborotni olish uchun esa sys.exc_info() funksiyalaridan foydalanish mumkin.