Php обробка винятків

Всі користувачі Мережі знають, як часом неприємно відкривати сторінку і бачити замість довгоочікуваної статті / блогу / картинки якийсь малозрозумілий текст, який повідомляє про помилку сервера. На жаль, реальність Інтернет така, що дуже складно зробити скрипт, що однаково добре працює на будь-якій платформі і при будь-яких настройках сервера.

Тому дуже важливо вміти коректно виявляти і обробляти помилки, які можуть виникнути в скрипті. Для цього в PHP передбачено два механізми - обробка помилок і обробка виключень.

З точки зору розробника, основна відмінність помилки від виключення в тому, що після виникнення помилки скрипт може продовжити виконання, а після виникнення виключення - немає.

Ще одна відмінність - для обробки винятків необхідно використовувати функції та спеціалізовані мовні конструкції, а для обробки помилок - тільки функції.

Винятки - це будь-які аварійні ситуації, що виникають при виконанні скрипта. У PHP виняток можна згенерувати ( "викинути", "викликати") і зловити його. Виняток може сенеріроваться як інтерпретатором, так і розробником.

Виклик виключення проводиться таким чином:

Перехоплення виключення здійснюється за допомогою конструкції try. catch. У загальному вигляді ця конструкція записується так:

Варто відзначити, що блоків catch може бути багато, по одному на кожен клас перехоплюваних винятків. Таким чином можна створити фільтр виключень. тобто перехоплювати не всі, а лише обрані типи винятків, а всі інші будуть перехоплені стандартним обробником PHP.

При необхідності можна створити власний клас обробки іскоюченій, успадкувавши його від класу Exception. Власний клас обробки виключень - це зручний інструмент розробника, дає можливість вести логи, відображати повідомлення про помилки, змінювати хід виконання скрипта і багато інших можливостей.

Законне питання - навіщо самому викликати помилку? Розглянемо простий приклад - є функція формування звіту про діяльність компанії. Ця функція містить кілька сотень рядків коду, викликає ще десяток функцій і читає дані з баз даних і файлів. Тепер уявімо ситуацію, коли одна з баз даних раптом відключилася, а ми про це дізналися лише в середині процедури. Раз немає даних, то і формувати звіт немає сенсу - він буде неповним і некоректним. Але як перервати виконання основної функції, одночасно повідомивши подробиці помилки? Можна зробити за допомогою декількох if..else, але більш простим рішенням буде використання винятків.

У цьому прикладі ми оголошуємо два спадкоємця від класу Exception і виконуємо генерацію звіту. Насамперед ми підключаємо всі потрібні джерела даних (бази даних, файли та ін). Якщо хоча б один джерело не підключився - продовжувати роботу не можна і потрібно попередити адміністратора про помилку. Тому генеруємо виняток типу ExceptionMailer. Якщо підключення пройшло успішно - продовжуємо роботу, обробляємо дані і генеруємо звіт на основі шаблону. Якщо шаблон не знайдено - генеруємо відповідне виключення.

У розглянутому прикладі важливу роль відіграє порядок catch, точніше порядок перевірки на тип винятку. Якщо першим поставити Exception, то всі інші винятки ніколи не спрацюють, тому що конструкція catch (Exception $ ex) перехоплює абсолютно всі доступні виключення.

PHP дозволяє використовувати свій обробник виключень. Для цього необхідно оголосити власну функцію обробки і зареєструвати її за допомогою функції set_exception_handler ().

Після цього всі виникаючі виняткових випадках, не обрамлені конструкцією try. except, будуть передаватися в оголошену вами функцію. Наприклад, можна змінити функцію, щоб вона писала все виключення в файл і видавала користувачеві в браузер "красиве" повідомлення про помилку сервера:

Іноді ця функція буває дуже зручною, особливо в процесі налагодження скриптів безпосередньо на сервері. Якщо виводити виключення як зазвичай в браузер - їх зможуть побачити відвідувачі, а це не додасть популярності вашого сайту. Набагато менш болісно користувачі сприймуть повідомлення типу "Вибачте, сервер знаходиться на обслуговуванні, спробуйте увійти пізніше.". Тому всі помилки і виключення необхідно писати в файли, а краще ще й відправляти адміністратору на email.

Хорошим тоном при створенні сайтів вважається повна відсутність помилок. Якщо ж помилки виникають - вони повинні бути оброблені і представлені користувачеві і розробнику в зрозумілому вигляді.

Схожі статті