Під винятковою ситуацією розуміють таку ситуацію що виникли в ході виконання коду, коли неясно, що робити далі або подальше виконання коду безглуздо. Наприклад, скрипту не вдалося встановити з'єднання з базою даних, тоді додавання або вибірка даних з неї свідомо безглузда. В php в подібних ситуаціях часто нативная функція просто повертає false і виконання явно непрацюючого коду триває. Щоб уникнути подібної ситуації можна перевіряти значення повертається функцією і, в разі якщо воно говорить про виникнення помилки, виводить попередження. Такий підхід має деякі недоліки. По-перше, для зміни дій виконуваних при помилку користувачеві вашого коду доведеться редагувати ваш код. Набагато краще було б дозволити йому самому визначати механізм обробки цієї помилки. По-друге, повернений функцією значення не завжди може бути правильно розцінений, або зовсім залишитися непроверяемим, тоді в разі помилки доведеться витрачати час на з'ясування її причин. По-третє, не завжди вірно прагнути обробити будь-яку проблему прямо в методі або в функції, адже в такому випадку валідація параметрів і обробка помилок може захарастила спочатку досить простий код. Набагато краще якимось чином повідомити користувачеві вашого коду, що щось пішло не так, дозволивши йому самому вирішувати, що робити в такому випадку.
Для вирішення всіх цих проблем і був придуманий механізм обробки виключень.
винятки
Виняток - це об'єкт, який є екземпляром вбудованого класу Exception. Цей об'єкт створюється для зберігання інформації про виникнення помилки і для виведення повідомлень про неї.
Конструктор класу Exception може приймати два необов'язкові параметри: рядок, що містять повідомлення про помилку і її код. Клас Exception так само містить методи, які допомагають встановити причину виниклої помилки.
- getMessage - повертає рядок, яка була передана конструктору і містить повідомлення про помилку.
- getCode - повертає код помилки (тип int), який був переданий конструктору.
- getFile - повертає ім'я файлу в якому було згенеровано виняток.
- getLine - повертає номер рядка в якій було згенеровано виняток.
- getTrace - повертає багатовимірний масив, що містить послідовність методів, виклик яких привів до генерування винятку. Так само містить параметри, які були передані цим методам і номера рядків, де здійснювалися виклики.
- getTraceAsStrin g - повертає строкову версію даних, які повертає метод getTrace.
- __toString - магічний метод, який викликається, коли екземпляр класу Exception наводиться до рядка.
генерація винятків
Для генерації виключення використовується ключове слово throw і екземпляр класу Exception. який дуже часто створюється прямо після інструкції throw. З англійської throw перекладається як «кидати», що дуже точно описує поведінку цього оператора, який може генерувати (кидати) виключення, надаючи коду, який викликав метод, в якому розташований цей оператор, самому обробляти виключення.
Давайте розглянемо клас для отримання деяких конфігураційних даних з ini-файлу.
Код цього класу сильно спрощений і в ньому не передбачена обробка помилок. Наприклад, при відсутності ini-файлу, неправильному його форматуванні або відсутності в файлі деяких даних, цей код не буде працювати коректно.
Файл з яким буде працювати цей клас може виглядати приблизно так:
userName = «true-coder»
password = «veryLongAndDifficult»
hostName = «localhost»
Для того щоб повідомити про виниклу помилку, що допоможе користувачеві класу Config адекватно на неї зреагувати і, можливо, запобігти виконанню некоректно працюючого коду, використовуємо механізм генерації виключень.
Внесемо деякі зміни в конструктор класу Config.