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.