PHP Try Catch Пример: Урок за обработка на изключения и грешки
Какво е изключение?
Грешка е неочакван програмен резултат, който не може да бъде обработен от самата програма.
Грешките се отстраняват чрез коригиране на програмата. Пример за грешка би бил безкраен цикъл, който никога не спира да се изпълнява.
Изключение е неочакван програмен резултат, който може да бъде обработен от самата програма.
Примери за изключение включват опит за отваряне на файл, който не съществува.
Това изключение може да бъде обработено чрез създаване на файла или предоставяне на потребителя на опция за търсене на файла.
Защо да обработваме изключението?
- Избягвайте неочаквани резултати на нашите страници, които могат да бъдат много досадни или дразнещи за нашите крайни потребители
- Подобрете сигурността на нашите приложения, като не разкривате информация, която злонамерените потребители могат да използват, за да атакуват нашите приложения
- Изключенията на Php се използват за промяна на нормалния поток на програма, ако възникне някаква предвидима грешка.
PHP обработка на грешки
Когато възникне грешка, в зависимост от вашите конфигурационни настройки, PHP показва съобщението за грешка в уеб браузъра с информация, свързана с възникналата грешка.
PHP предлага редица начини за обработка на грешки.
Ще разгледаме три (3) често използвани метода;
- Die изявления– функцията die съчетава ехото и функцията за изход в едно. Много е полезно, когато искаме да изведем съобщение и да спрем изпълнението на скрипта, когато възникне грешка.
- Персонализирани манипулатори на грешки – това са потребителски дефинирани функции, които се извикват при възникване на грешка.
- Отчитане на грешки в PHP – съобщението за грешка в зависимост от вашите настройки за докладване на грешки в PHP. Този метод е много полезен в среда за разработка, когато нямате представа какво е причинило грешката. Показаната информация може да ви помогне да отстраните грешки в приложението си.
Примери за обработка на грешки
Нека сега да разгледаме някои прости примери с процедури за обработка на грешки.
Да предположим, че сме разработили приложение, което използва текстови файлове за съхраняване на данни. Може да искаме да проверим съществуването на файла, преди да се опитаме да прочетем данни от него.
Кодът по-долу изпълнява горния пример.
<?php $denominator = 0; echo 2 / $denominator; ?>
Ако приемем, че сте запазили файла simple_error.php в папката phptuts, отворете URL адреса http://localhost/phptuts/simple_error.php
Ще получите следните резултати
Както можете да видите от горните резултати, това прави приложението ни да изглежда непрофесионално и може да бъде досадно за потребителя.
Ние ще променим горния код и ще напишем манипулатор на грешки за приложението
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
Ако приемем, че сте запазили горния код като error_handling.php, отворете URL адреса http://localhost/phptuts/error_handling.php
Забележка: добра практика за сигурност е да показвате съобщение като показаното по-горе, вместо да показвате съобщение като „Файлът не е намерен“.
Нека да разгледаме друг пример, който използва персонализиран манипулатор на грешки.
Персонализираният манипулатор на грешки ще бъде зададен като функция за обработка на грешки в PHP по подразбиране и основно ще показва номер на грешка и съобщение.
Кодът по-долу илюстрира изпълнението на горния пример
<?php function my_error_handler($error_no, $error_msg) { echo "Opps, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
Отворете URL адреса http://localhost/phptuts/custom_error_handler.php ще получите следните резултати
Както можете да видите от горния пример, персонализираните манипулатори на грешки са мощни в смисъл, че
- Те ни позволяват да персонализираме съобщенията за грешка.
- Персонализираният манипулатор на грешки може също да включва регистриране на грешки във файл/база данни, изпращане на имейл до програмиста и т.н.
Нека сега разгледаме третия тип обработка на грешки. Ще използваме вградената в PHP функция error_reporting функция. Той има следния основен синтаксис
<?php error_reporting($reporting_level); ?>
ТУК,
- “error_reporting” е PHP функцията за докладване на грешки
- „$reporting_level“ не е задължително, може да се използва за задаване на нивото на отчитане. Ако не е посочено ниво на докладване, PHP ще използва нивото на докладване на грешки по подразбиране, както е посочено във файла php.ini.
Ниво на отчитане | Descriptйон | Пример |
---|---|---|
E_ПРЕДУПРЕЖДЕНИЕ | Показва само предупредителни съобщения. Не спира изпълнението на скрипта | докладване_за_грешка(E_ПРЕДУПРЕЖДЕНИЕ); |
E_NOTICE | Показва известия, които могат да възникнат по време на нормалното изпълнение на програма или може да са грешка. | докладване_за_грешка(E_ СЪОБЩЕНИЕ); |
E_USER_ERROR | Показва грешки, генерирани от потребителя, т.е. потребителски манипулатор на грешки | докладване_за_грешка(E_ПОТРЕБИТЕЛСКА_ГРЕШКА); |
E_USER_WARNING | Показва генерирани от потребителя предупредителни съобщения | error_reporting(E_USER_WARNING); |
E_USER_NOTICE | Показва генерирани от потребителя известия | error_reporting(E_USER_NOTICE); |
E_RECOVERABLE_ERROR | Показва грешки, които не са фатални и могат да бъдат обработени с помощта на персонализирани манипулатори на грешки | докладване_за_грешка(E_RECOVERABLE_ERROR); |
E_ALL | Показва всички грешки и предупреждения | докладване_за_грешка(E_ ВСИЧКИ); |
Разлика между грешки и изключения
- Изключенията са хвърлени и са предназначени да бъдат уловени, докато грешките обикновено са непоправими.
- Изключенията се обработват по обектно ориентиран начин. Това означава, че когато е хвърлено изключение; създава се обект за изключение, който съдържа подробностите за изключението.
Таблицата по-долу показва методите на обекта за изключение
Начин на доставка | Descriptйон | Пример |
---|---|---|
getMessage() | Показва съобщението за изключение |
<?php echo $e->getMessage(); ?> |
getCode() | Показва цифровия код, който представлява изключението |
<?php echo $e->getCode(); ?> |
getFile() | Показва името на файла и пътя, където е възникнало изключението |
<?php echo $e->getFile(); ?> |
getLine() | Показва номера на реда, където е възникнало изключението |
<?php echo $e->getLine(); ?> |
getTrace() | Показва масив от обратното проследяване преди изключението |
<?php print_r( $e->getTrace()); ?> |
getPrevious() | Показва предишното изключение преди текущото |
<?php echo $e->getPrevious(); ?> |
getTraceAsString() | Показва обратното проследяване на изключението като низ вместо масив |
<?php echo $e->getTraceAsString(); ?> |
__toString() | Показва цялото изключение като низ |
<?php echo $e->__toString(); ?> |
По-долу е основният синтаксис за хвърляне на изключение.
<?php throw new Exception("This is an exception example"); ?>
ТУК,
- „хвърляне“ е ключовата дума, използвана за хвърляне на изключението
- „ново изключение(…)“ създава обект за изключение и предава низ „Това е пример за изключение“ като параметър на съобщението.
Горният код извежда следното съобщение.
Сега ще разгледаме пример, който прилага изключения за хвърляне и улавяне.
Ще променим горния пример и ще включим опит, хвърляне и улавяне.
Той има следния основен синтаксис.
<?php try { //code goes here that could potentially throw an exception } catch (Exception $e) { //exception handling code goes here } ?>
ТУК,
- “try{…}” е блокът от код, който трябва да бъде изпълнен, който потенциално може да предизвика изключение
- „catch(Exception $e){…}“ е блокът от код, който улавя хвърленото изключение и присвоява обекта на изключение на променливата $e.
Кодът по-долу показва основния пример за изключение с внедрено изключение try, throw и catch.
Програмата умишлено хвърля изключение, което след това улавя.
<?php try { $var_msg = "This is an exception example"; throw new Exception($var_msg); } catch (Exception $e) { echo "Message: " . $e->getMessage(); echo ""; echo "getCode(): " . $e->getCode(); echo ""; echo "__toString(): " . $e->__toString(); } ?>
Отворете URL адреса http://localhost/phptuts/exception_handling.php Ще получите следните резултати.
Също така е възможно да се създадат множество изключения за един php try оператор в зависимост от вида на хвърленото изключение.
Вижте статията за MySQL, PHP достъп до данни… за примери за внедряване на множество изключения
Множество изключения
Множеството изключения използват множество блокове try catch за обработка на хвърлените изключения. Множеството изключения са полезни, когато;
- Искате да покажете персонализирано съобщение в зависимост от хвърленото изключение
- Искате да извършите уникална операция в зависимост от хвърленото изключение
Блок-схемата по-долу илюстрира как работят множество изключения
Нека да разгледаме пример, който използва множество изключения.
Ще модифицираме кода, който дели число на предадения знаменател.
Очакваме да възникнат два вида изключения;
- Деление на нула
- Деление на отрицателно число
За по-голяма простота ще покажем само типа изключение в нашите catch блокове.
Вграденият PHP клас Exception се използва за хвърляне на изключения.
Ще създадем два класа, които разширяват класа на изключение и ще ги използваме за хвърляне на изключения.
Кодът по-долу показва изпълнението.
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
Тестване на кода
Ще приемем, че сте запазили multiple_exceptions.php в папка phptuts.
Прегледайте URL адреса http://localhost/phptuts/multiple_exceptions.php
Превключете обратно към PHP файла и подайте -1 като параметър, както е показано на следната диаграма.
Прегледайте URL адреса http://localhost/phptuts/multiple_exceptions.php.
Какви резултати получавате? Предайте 3 като параметър.
Какви резултати получавате?
Oбобщение
- Грешките са неочаквани резултати, произведени от PHP код
- Обработката на грешки подобрява производителността на приложението
- PHP има вградени функции, които могат да се използват за персонализиране на начина, по който PHP докладва грешки
- Изключенията са като грешки, но те могат да бъдат уловени с помощта на блока catch, когато бъдат хвърлени.
- Показването на съобщения за грешка, които показват информация за грешка, се счита за лоша практика за сигурност.