Винятки в PHP

Винятки в PHP

При виникненні будь-яких помилок найчастіше просто повертають false. Потім там, де ця функція була викликана, можна перевірити її результат, і якщо там false, то виконати відповідні дії. Такий підхід має недоліки (наприклад, якщо там, де виникла проблема – зовсім не Ваш код, і Ви не знаєте, звідки взявся false). Механізм винятків в PHP дозволяє перехопити помилку під час виконання коду, яку потім можна обробити в найкращому місці програми. І що найважливіше, даний механізм дозволяє отримати код помилки. Давайте розберемо механізм винятків в PHP більш докладно.

Напишемо ось такий код:

 

<? php
class DataBase {
private $ mysqli;
public function connect ($ host, $ user, $ password, $ db) {
$ this-> mysqli = @new mysqli ($ host, $ user, $ password, $ db);
}
}
$ db = new DataBase ();
$ db-> connect ( “localhost”, “root”, “”, “lesson-local”);
?>

 

Не думаю, що код потребує коментуванні. Зазначу тільки наявність оператора “@”, який заглушає можливі помилки. Але тепер уявімо ситуацію, що користувач передав в метод connect () неправильні дані. Нам не потрібні ніякі Warning, що виводяться через PHP – вони зіпсують дизайн сайту, однак, нам необхідно ці помилки, проте, обробляти. Можна, звичайно, написати так:

if ($ this-> mysqli-> connect_errno! = 0) return false;

 

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

<? php
class DataBase {
private $ mysqli;
public function connect ($ host, $ user, $ password, $ db) {
$ this-> mysqli = @new mysqli ($ host, $ user, $ password, $ db);
if ($ this-> mysqli-> connect_errno! = 0) {
if ($ this-> mysqli-> connect_errno == 2002) throw new Exception ( “ERROR_HOST”); // Викидаємо виняток, якщо помилка пов’язана з адресою хоста
elseif ($ this-> mysqli-> connect_errno == 1044) throw new Exception ( “ERROR_AUTH”); // Викидаємо виняток, якщо помилка пов’язана з ім’ям користувача і паролем
elseif ($ this-> mysqli-> connect_errno == 1049) throw new Exception ( “ERROR_DB”); // Викидаємо виняток, якщо помилка пов’язана з назвою бази даних
}
}
}
$ db = new DataBase ();
try {// “Намагаємося” виконати код
$ db-> connect ( “localhost”, “root”, “”, “lesson-local”);
echo “Підключення вдалося”;
} catch (Exception $ e) {
/ * У цей блок ми потрапляємо, якщо було викинуто виключення * /
echo $ e-> getMessage (); // Можна замість цього додати if і вивести більш зрозумілу напис, ніж, наприклад, просто ERROR_HOST
}
?>

1 Star2 Stars3 Stars4 Stars5 Stars (3 Votes, average: 4.33 out of 5)

Залишити коментар