- Определение:
Изключителна ситуация (накр. изключение) представлява неочаквано или не толкова често срещано събитие възникнало по време на изпълнение на дадена програма
- Примери: недостиг на памет, деление на нула, прекъснат кабел (при мрежови конфигурациии) и др.
обща идея:
Обработката на изключения (exception handling) в съвременните ЕП и по-специално в обектно ориентираното програмиране включва следните средства:
– дефиниране на изключения (Е)
– разпознаване на настъпването на Е
– програмен код – отговор на Е (обработчик на изключения, прихващане на Е), който трябва да бъде изпълнен при настъпването на Е
Дефиниране на изключения в етапното птограмиране
- Предназначение: При възникване на изключителна ситуация, обикновено се налага някаква информация да се предаде на обработчика на изключения
- Реализация на този обмен в различните ЕП:
- чрез глобални променливи (Ada, PL/I) – най-простият механизъм, но тромав, бавен, и труден за четене
- параметризирани обработчици (Modula-3, CLU) – по-сложен и по-малко ефективен, но по-гъвкав и четлив
- специални обекти-изключения (Java, C++) – елегантен подход, който позволява използването на йерархия от подтипове за обработване на изключения
Разпознаване на настъпването на етапи в етапното програмиране – обявяване
- Предназначение: Да се сигнализира за условие, което не може да се обработи с текущата процедура или метод – текущата подпрограма прекратяват дейността си (по анормален начин) и обявява (raising, throwing в Java) изключителната ситуация на извикващата я програмна част
- Реализация в различните ЕП:
– Предварително дефинираните Е се обявяват автоматично, а тези дефинирани от потребителя – явно, чрез raise (throw)
– В Modula-3, CLU и Java възможността една процедура или метод да обяви Е се разглежда като част от нейната входно/изходна спецификация и трябва да бъде декларирана явно в заглавната част на процедурата или метода
– В С++ – явно обявяване при появя на Е
Предимства на механизма за обработка на Е
- Сигурност – появата на аномалия ще спре изпълнението на програмата по елегантен начин и ще даде съобщение, че се е появила изключителна ситуация (в някои случаи дори ако няма определен от програмиста обработчик на изключението)
- Яснота на алгоритъма – обработчиците на изключения се кодират само там, където е възможно да се наложи обработка на съответните изключения. Останалата част от кода не се натоварва с подробности около обработката на грешки
Обработка на Е в С++
Ситуациите, в които може да възникне грешка по време на изпълнение на програмата в С++ се класифицират в три групи:
- нормално изпълнение на функция, която връща код на завършване, който може и да е индикация за грешка (напр. ф-я за отваряне на файл). В този сл. от програмиста се очаква да изследва код на завършване и …
- неправилно изпълнение (напр. грешно предаване на параметри или извикване на ф-я в погрешен контекст) – проверката дали са верни подобни предусловия за правилното изпълнение на части от кода се проверяват обикновено с макроса assert
- изключения са ситуации на неправилно изпълнение на програмата в следствие на причини, които са независими от управлението на програмата (недостиг на памет, В/И грешки и др.) – обработват се чрез обявяване и прихващане на изключения
Е в С++ са елементи данни, които могат да бъдат използвани да връщат полезна информация
Синтаксис за дефиниране на защитен код – try-блок
try <блок>
<посл. от обработчици на изключения>
Където:
- <блок> е съставен оператор, който съдържа throw-израз пряко или в блока на ф-я, към която той предава управлението
- <посл. от обработчици на изключения> включва произволен брой catch-блокове (обработчици на Е)
! try-блоковете могат да се влагат пряко или чрез блока на ф-я, към която той предава управлението
Синтаксис за обявяване на изключение – throw-израз
throw <израз> незад.
Където:
- <израз> е аналогичен на този от оператора return
- throw без аргумент е допустим само в catch-блок или ф-я активирана от него и предизвиква обявяване на изключението, което се обработва в момента
Синтаксис за дефиниране на обработчик на изключение – catch-блок
catch (<декларация на изключения>) <блок>
Където:
- <декларация на изключения> е списък подобен на <списък формални параметри> при деклариране на прототипи на функции и показва типовете изключения, които обработчикът прихваща* (!всеки предварително дефиниран стандартен или потребителски тип на С++)
- <блок> е кодът на обработчика на изключения, който прихваща изключенията от съответните типове, обявени чрез throw-изрази
* обработчик за тип class или негов псевдоним(&) прихваща всички обявени изключения от същия тип или кой да е негов наследник. Ето защо обработчик за клас-предшественик не бива да предхожда тези за наследниците му
! catch-блокът допуска и следния синтаксис:
catch (…) <блок>, което означава, че обработчикът прихваща произволни изключения (системни и потребителски). !Трябва да е последният в последователността от обработчици за даден try-блок