Уроци по Python за изключения, PyNSK - сайт за Python

В този урок ще научите за важна функция на езика, без която една голяма програма не може. Нека поговорим за изключенията. Какви са те, как да ги използвате и как да създадете свои?

Изключения или изключения са грешки, възникнали по време на изпълнение. Например, какъв би бил резултатът от опит за четене на несъществуващ файл? Или ако файлът е бил случайно изтрит, докато програмата работи? Такива ситуации се разглеждат с изключения.

Ако Python не може да разбере как да заобиколи ситуацията, тогава той няма друг избор, освен да вдигне ръце и да съобщи, че е открил грешка.

По принцип са необходими изключения, за да се информира програмистът за грешки.

Най-простият пример за изключение е деление на нула:

В този случай интерпретаторът ни каза за изключението ZeroDivisionError - деление на нула.

В голяма програма изключения често възникват вътрешно. За да улесни програмиста да разбере грешката и причината за това поведение, Python предлага Traceback или казано на жаргон - следа. Всяко изключение съдържа кратка, но пълна информация за това къде е възникнала грешката. Проследяването улеснява намирането и коригирането на грешката.

Помислете за този пример:

В този пример можете ясно да видите кой път за изпълнение има програмата. Гледаме отдолу нагоре и стъпка по стъпка разбираме как сме стигнали до такова изключение.

В този пример, когато се опитаме да добавим цяло число и низ, получаваме изключение TypeError. В описанието веднага става ясно какво сме написали грешно.

Прехвърлянето на низ към цяло число води до изключение ValueError.

В проследяването на тези два примера можете да прочетете, че има грешки в такъв и такъв файл на такъв и такъв ред.

Списъкът с вградени изключения не свършва тук, следващият раздел обсъжда основните изключения и техните причини.

Йерархия на изключения

Изключението, което няма да видите, докато изпълнявате кода, е BaseException - основното изключение, от което се извличат останалите.

Има две основни групи в йерархията на изключенията:

  • Системни изключения и грешки
  • Обикновени изключения

Ако е по-добре да не правите обработката на първите (ако го правите, тогава трябва ясно да разберете защо), тогава обработката на вторите е напълно и напълно поставена на раменете на програмиста от Python.

Системата може безопасно да се припише на:

  • SystemExit - изключение, генерирано от функцията sys.exit при излизане от програмата.
  • KeyboardInterrupt - възниква, когато програмата бъде прекъсната от потребителя (обикновено чрез натискане на Ctrl+C).
  • GeneratorExit - възниква, когато се извика методът за затваряне на генераторния обект.

Останалите изключения са "обикновени". Обхватът на готовите изключения е голям.

За Python2 йерархията на изключенията може да бъде представена по следния начин:

Списъкът с изключения обхваща широк спектър от ситуации и програмни грешки. Ако предупрежденията изискват само внимание, тогава грешките вече могат да спрат изпълнението на програмата.

Python3 има нови изключения и йерархията е както следва:

Като цяло се забелязва, че при създаването на Python3 е добавен блок от нови изключения. Но дори тези почти 70 изключения не са достатъчни при писане на програми на Python.

Използване на изключения

Разгледахме какво представляват изключенията, какво представляват и как да ги анализираме. Но досега явно не сме обмисляли толкова важно нещо като тяхното използване.

Да започнем с обработката.

Обработка на изключения

Да вземем случая на деление на 0.

Този код ще доведе до изключение ZeroDivisionError. За да предотвратим това да се случи, нека използваме конструкцията try..except, като тази:

Ако изпълните този код, тогава низът "цялочислено деление или модул на нула" ще се покаже на конзолата. Изглежда, че това наистина не ни даде нищо, грешката все още е там. Можете обаче да поставите обработка в блок за изключение.

Например, ние се съгласихме, че стойността на променливата c в случай на грешка при делене е -1. След това променяме кода:

Преди да продължим, нека разгледаме още една възможност.

Да кажем, че имаме файл с данни във файловата система и трябва да го прочетем. В този случай веднага изскачат няколко изключения, като например: няма файл, файлът е повреден; файлът е празен (според заданието знаем, че има данни в него) и други.

Използвайки изключения, можете да разрешите този проблем по следния начин:

В този фиктивен код новият ход е да се уловят няколко вида изключения. Когато бъде хвърлено изключение, то се сравнява отгоре надолу с всеки тип, докато се намери съвпадение. Ако няма съвпадение, тогава изключението ще отиде нагоре по веригата за изпълнение на кода.

Ако обработката на различните видове изключения е еднаква, тогава намаляването на количеството код не става проблем:

Хвърляне на изключения

Когато работи с изключения, програмистът прекарва по-голямата част от времето за обработка, но има ситуации, когато изключения трябва да бъдат хвърлени на други.

На програмистки жаргон "изхвърляне на изключение" означава да напишете код, който, когато бъде изпълнен, ще хвърли изключение.

Например функция, която решава квадратно уравнение. Вие се съгласихте, че корените са само реални, тогава в случай на сложни корени си струва да хвърлите изключение.

Да сехвърлете изключение, което трябва да използватеraise

където IOError е класът на изключението.

Ако, когато обработвате изключение, искате да го хвърлите още по-високо, тогава трябва да напишете следния код:

Собствени изключения

Когато пишете свои собствени програми, разумно е да искате да добавите изразителност към вашия код, както и да привлечете други програмисти към специални изключения. За да разрешите този проблем, трябва да използвате свои собствени изключения.

При минимална реализация е необходимо да се наследи от някакъв клас в йерархията на изключенията. Например така:

След това можете да хвърлите собствено изключение:

Лесно се вижда, че създаваме клас, което означава, че всичко, което знаем за класовете, се отнася и за изключенията. Можете да създавате променливи и да извършвате тяхната обработка. Обикновено изключения са много малки класове. Те трябва да бъдат изпълнени възможно най-бързо.

Допълнение: Пълната форма на try..except

пробна форма. освен не е завършен, опитайте..освен..друго..накрая е завършен.

Прилагането на пълната конструкция може значително да опрости кода, както и да го направи по-безопасен. Нека си представим, че програмата чете файл и трябва да се увери, че файловият обект е правилно затворен и че не е хвърлено изключение. Това може да се постигне с помощта на блок finally.

С други думи, finally изпълнява блок от изрази, независимо дали е имало изключение или не. И операторът else се изпълнява, ако няма изключение.

По принцип използването на пълната форма е:

Урокът се занимава с въпроси, свързани с изключенията:

  • Какво е изключение
  • Какви видове изключения присъстват в езика
  • Как да обработваме изключенията
  • Как да хвърлям изключения
  • Как да създадете свой собственизключения
Дата 2016-01-29 17:32:30 Категории Уроци по Python , Уроци по Python , Уроци Етикети