Обробка винятків
Донедавна програмістам доводилося виявляти неабияку винахідливість у пошуку способів усунення ситуацій виникнення помилок у сценаріях мовою PHP. Для цього вони або задавали та виводили рядки з описом помилок, або намагалися скористатися всіма можливими засобами обмеженої системи реєстрації помилок. Незважаючи на наявність інших численних корисних засобів, інтерпретатор PHP не підтримував якісну систему, що дає змогу успішно справлятися з ситуаціями виникнення помилок. На щастя, з виходом версії PHP 5 ситуація змінилася на краще.
Обробка помилок та винятків у PHP
Програмісти, знайомі з мовами структурного програмування, як C# і Java, мабуть, давно звикли використовувати різні вбудовані об'єкти, дозволяють справлятися з помилками і винятковими ситуаціями. Таким фахівцям буде приємно дізнатися, що тепер у версії PHP 5 вперше з'явився об'єкт, призначений для обробки виняткових ситуацій, і що синтаксичні конструкції для роботи з цим об'єктом нагадують існуючі мови, такі як Java. Насправді навіть після короткого знайомства з цими синтаксичними конструкціями розробник може розпочати обробку помилок та виняткових ситуацій у мові PHP багато в чому за таким же принципом, який застосовується в інших об'єктно-орієнтованих мовах.
Але тим програмістам, які переважно використовують мову PHP і не знайомі з іншими мовами, ідея обробки винятків може здатися незвичною. — це потужний інструментальний засіб, який можна буде по-справжньому оцінити, тільки зрозумівши, у чому його задум, і вперше успішно застосувавши у своєму коді. Нові вбудовані функції мови PHP дозволяють займатися налагодженням у ситуаціяхвиникнення помилок, відновлювати нормальну роботу після виявлення непередбачених ситуацій та створювати для своїх кінцевих користувачів наочний та зручний інтерфейс, що не вимагає виведення повідомлень про помилки на екран.
Помилки та виняткові ситуації
Приступаючи до вивчення цієї теми, необхідно передусім зрозуміти, що порушення у роботі програми є виняткову ситуацію, а чи не просто помилку. Як випливає з самого цього терміну, виняткова ситуація є будь-якою умовою, що спостерігається в ході виконання програми, яка або є непередбаченою, або дії, пов'язані з цією умовою, не передбачені в рамках нормального виконання програми. Взагалі кажучи, виняткову ситуацію слід розглядати не як невиправну помилку, через яку має зупинитися виконання програми, а як умова, яка може бути виявлена, та вжиті дії, що дозволяють продовжити роботу належним чином.
Виняткові ситуації при їх належному використанні дозволяють значною мірою підвищити надійність програми і в основному позбавитися труднощів, пов'язаних з налагодженням. Але неправильно оброблювані чи невірно визначені виняткові ситуації можуть створити більше проблем, ніж можна було б усунути за їх допомогою, оскільки такі виняткові ситуації ускладнюють виявлення джерела помилки. Це означає, що необхідно приділяти достатню увагу вирішенню завдання правильного визначення та здійснення прийнятого методу обробки виняткових ситуацій, оскільки це принесе значну користь.
Нижче наведено приклад коду, який містить деякі засоби виявлення помилок у тому вигляді, як вони могли бути реалізовані у версії PHP 4 або в одній з попередніх версій. У цьому кодіздійснюється вибірка змінної POST, що містить ідентифікатор користувача. Такий ідентифікатор повинен мати довжину щонайменше дев'ять символів і починатися з префіксу "usr":
Приклад методу обробки помилок без використання винятків
Цілком очевидно, що функція is_valid_user() може повернути значення false внаслідок недотримання будь-якої із зазначених вимог. Застосування винятків дозволяє простіше організувати виявлення помилок різних типів, після чого вживати відповідних заходів, враховуючи характер кожної окремої помилки.
Клас Exception
У версії PHP 5 передбачений новий клас Exception, який може безпосередньо використовуватися в будь-якому коді, який виконується під керуванням сервера PHP 5 або пізнішої версії. У наведеному вище прикладі застосовувалися булеві функції, а клас Exception дозволяє створювати або активізувати в коді виняткові ситуації — екземпляри цього класу.
У наступному прикладі показано, який вид може набути попередній приклад після його коригування з метою використання засобів обробки виняткових ситуацій:
Код PHP

У цьому коді для активізації виключення застосовується оператор throw. А самі засоби обробки виняткових ситуацій у цьому випадку використовувалися для створення нового об'єкту Exception. Завдяки застосуванню цих засобів з'являється можливість обробляти помилки, що порушують нормальний хід виконання програми, як окремі виняткові ситуації, тому помилки більше не можуть впливати на іншу частину програми.
Перехоплення та обробка виняткових ситуацій здійснюється за допомогою керуючої конструкції try/catch. Насамперед необхідно включити будь-який код, виконання якого може призвести до виникнення помилки абовиняткової ситуації, конструкцію try(). При активізації у цьому коді будь-якої виняткової ситуації виконання блоку try() припиняється; це означає, що код, що залишився, в конструкції try() не виконується. Потім блок catch() проглядається для пошуку виняткової ситуації відповідного типу, а обробка виняткової ситуації відбувається за допомогою коду, який міститься в даному конкретному блоці catch. Завдяки такій організації роботи може бути передбачений аналіз різних умов з урахуванням типу активізованої виняткової ситуації, але не робиться безнадійна спроба впоратися з якоюсь загальною, неконкретизованою помилкою.
Активізація виняткової ситуації
Завдяки використанню виняткових ситуаціях з'являється ще одна зручна можливість – надавати користувачеві настільки багато (або настільки мало) інформації про помилку, наскільки це доцільно. У поєднанні з об'єктом Exception допускається застосування кількох методів обробки виняткових ситуацій, які можуть використовуватися для створення власних повідомлень про помилки або організацію правильних дій у ситуації, що склалася.
Нижче наведено код, який показує, як можна активізувати і відразу ж перехопити універсальну виняткову ситуацію, а потім застосувати методи об'єкта Exception для вилучення переданого повідомлення, коду помилки, імені файлу та номера рядка, що стало джерелом помилки:
Код PHP

У цьому випадку відображається стандартне повідомлення про помилку в стилі PHP. Однак програміст може передбачити висновок будь-якої інформації, яку він визнає за необхідну, і навіть може змінити дії, що виконуються в додатку, з урахуванням конкретної помилки. Для цілеспрямованої обробкивиняткових ситуацій більше одного типу можуть використовуватися численні блоки catch. Приклад такої організації програми наведено у наступному розділі.
Визначення власних підкласів Exception
Мова PHP дозволяє визначати власні класи, які успадковують методи класу Exception. Це означає, що можна більше не обмежуватися використанням лише функції getMessage() для отримання інформації про те, який саме тип має помилка. Підкласи можуть бути визначені так, як показано в наступному прикладі:
Розглянемо приклад, наведений нижче, демонструє способи використання спеціалізованих виняткових ситуацій. Цей код призначений для забезпечення взаємодії з користувачами, які підписуються на певні послуги. Користувачі можуть забути включити обов'язковий префікс "usr" у свій ідентифікатор користувача, тому за відсутності цього префікса можна передбачити можливість додати його і знову перевірити справжність користувача, а не припиняти виконання програми:
Зверніть увагу, що в цьому прикладі робиться спроба відновити роботу після виявлення умови помилки "відсутній префікс". Цілком очевидно, що тепер існує можливість легко справлятися з окремими типами помилок після того, як їх буде визначено окремо в програмі.