Разница между операторами try-catch и if-else в PHP
Попытки и уловки используются в PHP для обработки исключений, как и в других языках, таких как C ++, Java и т. Д. Исключение — это неожиданный результат или неожиданное состояние программы, которое может обрабатываться самой программой. Чтобы справиться с такими неожиданными результатами в PHP, используются методы try and catch. Дополнительные сведения см. На странице Обработка исключений в PHP.
Точно так же PHP также выполняет условные операторы, используя if и else для обработки сценариев принятия решений. Для получения дополнительной информации посетите веб-сайтPHP | Принимать решение
Различия между try-catch и if-else в PHP:
- if: он проверяет, является ли какое-либо условие «истинным» или нет, если оно истинно, то выполняет код внутри блока if.
- else: Если условие «ложно», что проверяется блоком if , тогда блок else выполняет другой код внутри него.
if(condition) else if(condition) else
- try: это раздел, в котором определяется блок кода для проверки того, генерирует ли код неожиданный результат при выполнении.
- catch: это раздел, в котором определяется другой блок кода, который выполняется, если в блоке try генерируется какой-либо неожиданный результат. Фактически этот блок кода обрабатывает исключения.
try… catch VS if…else. Что, когда и почему?
Эволюция языков программирования приводит иногда к кардинальным изменениям в мировоззрении разработчиков. В мире РНР такое случилось при появлении пятой ветки, которая принесла новую объектную модель, новые наборы встроенных функций и новые методы обработки ошибок…
Те, кто начинал знакомиться с PHP (тут и далее я буду подразумевать пятую версию), после другого процедурного языка программирования, так и не поняли что же такого в переходе от 4ки к 5ке и продолжают оформлять код привычными функциями, которые находятся на одном уровне по отношению друг к другу, а так же каждое действие проверяют на удачный код возврата. Но те кто знали об исключениях и классах…
Теория
Исключение (Exception) — сигнал отправляемый программой в интерпретатор, о возникновении нештатной (исключительной) ситуации во время исполнения кода.
В PHP работа с исключениями основана на тех же принципах что и везде. Для генерации исключения используется оператор throw, которому передается объект исключения, принимающий в конструкторе два необязательных параметра: сообщение исключения и код исключения.
Для того, что бы отловить исключение, используется конструкция try. catch. В блоке try выполняются операции, которые могут привести к исключительной ситуации, а блок catch позволяет принять решение что делать, если исключение было брошено.
try throw new Exception(\\\»Exception message\\\»);
echo \\\»That code will never been executed\\\»;
> catch (Exception $e) echo $e->getMessage(); //выведет \\\»Exception message\\\»
>
Как видно из примера, при выбрасывании исключения, остальной код в блоке try выполнен не будет, а управление будет передано в оператор catch, в котором мы указываем, как будет называться объект, в который будет передано выброшенное исключение (в нашем случае — $e). Внутри блока оператора catch, на основании данных из исключения мы можем применять какое-либо действие в зависимости от ситуации. Сейчас мы просто вывели сообщение, которое было передано исключением.
Объект Exception (который кстати можно унаследовать) имеет следующий набор финальных (final) методов:
final function getMessage(); // сообщение исключения
final function getCode(); // код исключения
final function getFile(); // файл из которого брошено исключение
final function getLine(); // строка бросания
final function getTrace(); // массив стека вызовов
final function getTraceAsString(); // массив стека вызовов отформатированый в строку
Практика
Когда же удобно использовать исключения? Да всегда, когда функция или метод может прийти к ошибочной ситуации! На примере встроенной функции mysql_connect() и mysql_select_db(), если бы они бросала исключения при ошибке соединения и выборе базы данных соответственно, код выглядел бы так:
try mysql_connect($hostname, $username, $password);
mysql_select_db($dbname);
> catch (Exception $e) echo $e->getMessage(); //выведет либо сообщение об ошибке подключения, либо об ошибке выбора
>
И в зависимости от результата мы бы:
* удачно присоединились бы к СУБД и выбрали БД (код в сatch блоке не выполнился бы)
* при неудаче соединения с СУБД, вывели бы соответствующую ошибку и прикатили выполнение сеанса
* при ошибке выбора БД, оповестили бы пользователя об этой неприятности
Теперь самое время спросить: \\\«А зачем нам такая сложная штука, если можно использовать оператор if?\\\».
Первый же ответ: \\\«Потому что так код более читабельный, а обработка ошибок выведена в отдельный блок\\\». Если бы мы использовали оператор if, то код выглядел бы следующим образом:
$connId = mysql_connect($hostname, $username, $password);
if (false == $connId) echo \\\»Ошибка подключения к СУБД\\\»;
>
$flag = mysql_select_db($dbname);
if (false == $flag) echo \\\»Невозможно выбрать базу данных.\\\»;
>
Согласитесь, что в предыдущем варианте код выглядит более понятным. Но это еще не все. Теперь обработкой этих ошибок заниматься непосредственно разработчику не обязательно — достаточно выбросить исключение, а его обработкой можно заняться на более высоком уровне. Так же исключения можно передавать цепочкой (chain) наверх:
class MyException extends Exception <>
try try //.
throw new Exception(\\\»inner\\\»);
//.
> catch (Exception $e) throw new MyException(\\\»outer\\\»);
>
> catch (MyException $e) echo $e->getMessage(); //выведет \\\»outer\\\»
>
Производительность
Пытаясь достичь истины, провел несколько экспериментов с различными типами функций.
Первый тип возвращал статус true и проверялся операторами if. else
Второй тип возвращал статус false и проверялся операторами if. else
Третий тип просто выполнял действия и ничего не возвращал. Проверялся блоком try. catch
Четвертый тип всегда бросал исключение и проверялся в try. catch
True: 0.72382092475891
False: 0.85190796852112
No exception: 0.72565317153931
Exception: 14.176206827164
как и ожидалось — бросание исключений довольно накладная операция, а вот оба варианта удачного выполнения прошли тесты вровень.
Тесты проводились на примитивных функциях сложения, но в 1кк итераций
Выводы
Когда же использовать исключения? Всегда, когда подразумевается ошибка или нестандартное поведение программы, а так же когда принятие решения об обработке результата необходимо переложить на более высокий уровень.
А что же делать с оператором if и булевыми статусами отработки функций? Оставить их. Но толко там где они действительно необходимы. Тоесть там, где логический оператор подразумевает использование результата в вычислениях, а не контроле потока выполнения. Тоесть все удачные завершения функций теперь не нужно оповещать оператором return true, если это логическое значение не пригодиться для дальнейших вычислений. И в то же время все статусы завершения функций с ошибками изменить из формата return false в формат throw new Exception()
Что нужно помнить? Использование исключений предполагает что весь код выполняется со статусом true (без ошибок), но если ошибка произошла, то для ее обработки всегда найдется место в блоке catch.
Difference between try-catch and if-else statements in PHP
The try and catch are used in PHP for handling exceptions like other languages such as C++, Java, etc. An exception is unexpected result or unexpected state of a program that can be handled by the program itself. To handle this kind of unexpected results in PHP, try and catch are used. For more details, visit Exception Handling in PHP.
Similarly, PHP also executes conditional statements using if and else to handle decision making scenarios. For more details, visit PHP | Decision Making
Differences between ‘try-catch’ and ‘if-else’ in PHP:
What are ‘if’ and ‘else’?
- if: It checks if any condition is “true” or not, if it is true then it executes the code inside the if block.
- else: If the condition is “false” which is checked by the if block, then else block executes the other code within it.
if(condition) else if(condition) else
What are ‘try’ and ‘catch’?
- try: It is a section where a block of code is defined for tested whether the code generates an unexpected result while executing.
- catch: It is a section where another block of code is defined, which is executed if any unexpected result generates in the try block. Actually this block of code handles the exceptions.
Error Handling: Mainly if-else block is used to handle errors using condition checking. if-else catch errors as a conditional statement. In many cases there are many corner cases which must be checking during a execution but “if-else” can only handle the defined conditions. In if-else, conditions are manually generated based on the task.
php
In case of try-catch block, it will check the system generated errors or exception during an executing process or a task. These errors or exceptions are not manually generated. try-catch handles the exceptions that are easily readable.
php
Runtime Errors : PHP Warning: Division by zero in /home/1027ff9c161eb6503f545005908318fc.php on line 8 Division is INF Exception: denominator is 0
Use one block to handle errors or exception: In case of if-else we have one else block corresponding to one if block, so we have to define each if block with a else block to handle “false” conditions. Also there may not be any else statement after if.
php
Range stated from 50000rs Range stated from 25000rs Not listed Range stated from 18000rs Range stated from 55000rs
In case of try-catch, we don’t have to define each try with a catch. There can be multiple exceptions defines inside one try and to catch the exceptions thrown by the try block, there can be one catch block.
php
Exception: denominator is a string Exception: denominator is 0 Division is 5
Brief discussion about the differences of ‘try-catch’ and ‘if-else’ in PHP:
if-else | try-catch |
---|---|
It checks any condition is true or not, if true then execute the code inside the if block otherwise execute else block. | ‘try’ is a section where a code is defined for tested whether the code generates an unexpected result while executing, if any unexpected result found catch block is executed to handle that situation. |
‘if-else’ use to handle different conditions using condition checking. | In case of ‘try-catch’, the system will check the system generated errors or exception during a executing process or a task. |
Conditions are manually generated in ‘if-else’. according to the task. | ‘try-catch’ handles system generated errors like, if a array is out of bound, divide by zero etc. |
In ‘if-else’ the conditions and the codes inside the blocks are got mixed, so that it becomes unreadable if there is many ‘if-else’ blocks. | In ‘try-catch’ the codes to handle the exceptions and what exception to be handled, that are easily readable. |
In ‘if-else’, we have one else block corresponding to one if block. Or we need to define another condition with command ‘else if’. | In ‘try-catch’ we don’t have to define each ‘try’ block with a ‘catch’ block. |
‘if-else’ is less time consuming than ‘try-catch’. | ‘try-catch’ is more time consuming than ‘if-else’. |
‘if-else’ communicate between the data provided to the program and the condition. | ‘try-catch’ communicate between the data with the conditions and the system. |