Винятки в php

Винятки в php

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

Що представляють собою виключення?

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

Як виключення PHP працюють на практиці?

З винятками можна здійснити дві дії: кинути (thrown) і зловити (caught). Якщо виняток вважається кинутим, то це означає тільки одне: в процесі роботи вашої програми відбулося щось, що виходить за рамки норми. В даному випадку вам потрібно буде використовувати іншу функцію. Підхопити виключення у вас вийде тільки в спеціальній функції, яка, в свою чергу, оповісти всю програму про те, що вона готова до обробки виключення.

  1. Уявіть, що ваш браузер - це пітчер, що кидає м'яч Кетчеру.
  2. Гравець, що відбиває м'яч, намагається влучити по ньому, але у нього це не виходить зробити. Як результат, він отримує страйк. Якщо ж гравець виконує своє завдання, то у польового гравця з'являється можливість спіймати м'яч.
  3. Польовий гравець ловить м'яч, і після цього у нього є два шляхи: кинути його іншому польовому гравцеві (при недостатній відстані від відбиваючого) або вивести відбиваючого з гри, кинувши в нього м'яч.

Кидок пітчера кетчер в нашому випадку можна порівняти з нормальним перебігом процесу. Однак якщо відбиває гравець вдається влучити по м'ячу, то настає той самий виняток.

Коли ж польовий гравець ловить м'яч, то така дія дуже схоже з виконанням функції try-catch, здатної обробляти виключення. Ця функція може не тільки сама виконати всі необхідні дії, але і перекинути виявлене виключення іншої функції.

Як правильно використовувати виключення?

Якщо ви хочете навчитися обробляти виключення PHP, то вам слід усвідомити одну річ: виключення становлять складову частину стандартної бібліотеки PHP (SPL), а також входять в ядро ​​PHP за умови, що вони належать 5 версії і вище. Вам же потрібно тільки зрозуміти суть їх застосування.

Винятки можна реалізувати таким же чином, як і будь-який інший об'єкт:

Виходячи з цього, у винятків є спеціальні методи, які при необхідності можна викликати. Останні значно полегшують процес формування реакції на конкретний виняток. Наприклад, така функція, як getMessage () дає можливість отримати повідомлення про помилку. А його, в свою чергу, можна вивести в браузер або записати в журнал.

Нижче наведемо список методів PHP винятків, які дозволяють отримувати повідомлення виключення - getMessage ();

  1. Повернути числовий код, представлений винятком - getCode ();
  2. Отримати файл, всередині якого відбулося виключення - getFile ();
  3. Повернути номер рядка в тому файлі, де виникло виключення - getLine ();
  4. Повернути масив backtrace () до моменту появи виключення - getTrace ();
  5. Отримати виняток, який виник перед поточним, якщо воно, звичайно, було - getPrevious ();
  6. Повернути масив backtrace () виключення в формі рядка - getTraceAsString ();
  7. Повернути у вигляді рядка всі винятки - toString (). Ця функція може бути переписана інакше.

Для більшої наочності вищевказаних методів, створимо клас User, через який буде здійснюватися початкове управління записами користувачів:

У наведеному прикладі присутній відразу кілька місць, в яких може виникнути виняток. Спершу $ user_id в функції _getUserRecord () зобов'язаний мати тип integer. Якщо ж процес піде іншим шляхом, то наступним кроком стане генерування винятку:

Після цього створюємо користувача з неправильним ідентифікатором:

Після цих дій має надійти системне повідомлення про помилку. А тепер згадаємо про польового гравця, який зобов'язаний не тільки зловити виняток, а й обробити його:

У тому випадку, коли у нас виходить зловити виняток, ми можемо уникнути появи системного повідомлення про знайдену помилку, сформованої PHP за замовчуванням.

Також пам'ятайте про те, що виникло виключення може бути зупинено тільки тоді, коли вищезгадана функція try-catch змогла зловити його. В іншому випадку в браузері буде виведена помилка. Спробуємо розібратися, де саме в наведеному нами прикладі виняток було кинуто.

  1. Створюється новий об'єкт User в рядку $ user2 = new User ( 'not numeric');
  2. Виконується функція __construct () класу User;
  3. Здійснюється перехід до функції _getUserRecord () класу User;
  4. Йде перевірка $ user_id за допомогою функції _validateUserId;
  5. У тому випадку, якщо $ user_id не визнана числовим значенням, об'єкт виключення викидається.

Крім того, можна виконати функцію getTraceAsString () з метою відстежити подальші виключення:

Якщо виняток виникло глибше виклику $ user2 = new User ( 'not numeric'), то воно виявляється нагорі до тих пір, поки блок try-catch не здійснить його обробку.

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

Однак і це можна змінити в момент створення винятку:

Обов'язково потрібно створити клас UserErrors:

Таким чином, відбувається модифікація обробника винятків для виведення коду винятку, який буде з'являтися замість повідомлення.

Також варто застосовувати і інші методи виключення для відстеження. Наприклад, можна створити клас Logger:

Після цього проводимо модифікацію обробки виключення для того, щоб можна було застосувати клас Logger:

Тепер ми домоглися того, щоб під час виконання програми виводився код винятку. У файлі exceptions_log.html можна буде подивитися всю інформацію, пов'язану з місцем розташування виключення.

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

Для створення такого виду виключення спершу потрібно побудувати клас винятків, який зможе розширити клас Exception.

Після цього слід створити для користувача виняток UserException для вищевказаного класу, який ми вже будували трохи вище:

У підсумку ми переписали функцію __construct, яка відповідає за реалізацію конструктора. Так як створений нами клас розширює клас Exception, то в даному випадку доречно застосувати його конструктор за допомогою директиви parent.

Таким чином, ми позбавляємо себе від постійної генерації повідомлень про помилку, використовуючи в своїй роботі лише код винятку. Також можна опустити функцію запису в журнал, так як точно таке ж передбачено в призначеному для користувача конструкторі.

Тепер оновлюємо код, який можна застосовувати для нового класу UserException:

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

Тепер намагаємося згенерувати три винятки:

Які ж вигоди чекають нас при використанні розширеного виключення?

По-перше, ми можемо створити користувальницький конструктор.

По-друге, з винятками розширеного типу ми можемо переписати функцію __construct і виконати власний код.

По-третє, організувати виняток може залежати від конкретного типу об'єкта. Ну, і по-четверте, ми можемо застосувати блок множинних перехоплень під час обробки виникли винятків залежно від їх типу.

Як використовувати блок множинних перехоплень?

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

Наприклад, блок try-catch здатний обробляти виключення лише звичайного типу. А дана методика більше призначена для незапланованих випадків.

Тепер постараємося змінити наявний код таким чином, щоб виключення UserException оброблялося особливим чином. Для цього необхідно застосувати ще один блок перехоплення, і тоді все несподівані винятки почнуть успішно оброблятися.

Наведені вище виключення (UserException і Exception) можуть бути оброблені різними способами, і деяким з вас може здатися, що в роздільної їх обробці немає ніякої користі. Однак так ви зможете домогтися показу або записи в журнал лише особливих винятків.

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

--------- за матеріалами net.tutsplus.com ---------

Схожі статті