Вообщем, решил разобраться, что такое выброс ошибок, посмотрел вот этот код: PHP: <?php error_reporting ( E_ALL ); if ( version_compare ( PHP_VERSION, '7.1.0', '<' ) ) { die ( 'Error: Please, update module PHP ver ' . PHP_VERSION . ' ver < 7' ); } class View { protected $a = [], $template; public function assign( string $name, int $value ) { if ( isset ( $this -> a[$name] ) ) throw new Exception( sprintf ( 'Заданное имя %s уже существует', $name ) ); $this -> a[$name] = $value; return $this; } public function template( string $s ) { $this -> template = $s; return $this; } public function output() { if ( empty ( $this -> template ) ) throw new Exception( 'Шаблон не задан' ); $string = ''; foreach ( $this -> a AS $name => $val ) { $string .= sprintf ( $this -> template, $name, $val ) . '<br>'; } return $string; } public function __toString() { return $this -> output(); } } ( $view = new View ) -> assign( 'kentkent7', 12 ) -> assign( 'mkramer', 708 ) -> assign( 'виталий032', 15 ) -> assign( 'MouseZver', 1 ) -> template( 'Школьник %s, ему %d лет' ); $lalki = $view -> output(); echo "ТУТ ВСЕ ЛАЛКИ:<br>{$lalki}"; /* или */ //echo $view; Есть ли преимущества у thow new Exception() ? Ведь можно было сделать, например, вот так (кусок): PHP: public function assign( string $name, int $value ) { if ( isset ( $this -> a[$name] ) ) { print_r(sprintf ( 'Заданное имя %s уже существует', $name ) ); } else { $this -> a[$name] = $value; return $this; } }
Есть, и очень большое. Я бы посоветовал ознакомится с исключениями и использовать их в дальнейшем. "Выбросить" исключение и выдать сообщение через echo/print - это не одно и тоже...
@Griffter расскажите в чем разница)) в любом случае обычно в скриптах прячут отображение ошибок)) одно дело отлавливать ошибки и писать их в лог скрипта, что бы потом админ скрипта не залазя в логи сервера мог посмотреть где какие ошибки возникали .. а другое дело а помощью исключений ловить ошибки и вываливать сообщение на экран)
Так а я и не говорил, чтобы исключения вываливали на экран. Я сказал что: PHP: throw new Exception( sprintf ( 'Заданное имя %s уже существует', $name ) ); и PHP: print_r(sprintf ( 'Заданное имя %s уже существует', $name ) ); Это не одно и тоже.
почему убивает?? вроде код дальше идет.. PHP: <?php function inverse($x) { if (!$x) { throw new Exception('Деление на ноль.'); } return 1/$x; } try { echo inverse(5) . "\n"; echo inverse(0) . "\n"; } catch (Exception $e) { echo 'Выброшено исключение: ', $e->getMessage(), "\n"; } // Продолжение выполнения echo "Hello World\n"; ?> Результат выполнения данного примера: Код (Text): 0.2 Выброшено исключение: Деление на ноль. Hello World https://php.ru/manual/language.exceptions.html
Исключение, в ряде случаев, позволяет просто писать код без миллиарда проверок, но с пачкой обработчиков на случай, если что-то случится. Всего не предугадать, всяко бывает. В php они не настолько ощутимы как польза. А вот на десктопе... Вот прикинь, запустил ты в продакшен приложение. И оно работает у каждого пользователя индивидуально. Ты не можешь, сидя у себя дома найти баг, выпилить его, накатить апдейт на сервер его и вуаля, у всех новая версия. Хрентотам. И все предвидеть не можешь. Но, зато, можешь обернуть все критические места кода в кэтчи, благодаря которым можно даже вернуть ситуацию в свои руки. Тут как бы выбор - либо приложение падает на ровном месте, либо у него есть шанс разобраться в ошибке и продолжить работу.
Спасибо за пример! Теперь понятно. Алекс8, не выполняется дальше. Вот например, не возвращает переменную $text PHP: <?php class unit { public function exist() { if(1 == 1) throw new Exception('Блин'); $text = 'It works'; return $text; } public function __construct() { $text = $this->exist(); echo $text; } } $undefined = new unit;
Главное преимущество (которое @Fell-x27 вскользь немного указал) - это то, что обработчик исключения может быть намного выше по стеку вызовов, чем функция, выкинувшая исключение. PHP: class SomeExceptionClass extends Exception {/* .... */}; function f1() { if (error()) throw new SomeExceptionClass("error"); /* куча кода */ } function f2() { f1(); } function f3() { f2(); } function f4() { f3(); } try { f4(); } catch (SomeExceptionClass $e) { /* Do something with this error */ } С кодами ошибок такое не пройдёт, пришлось бы на каждом уровне проверять. А, особенно при ООП, стек вызовов в реальном проекте может очень глубоко опуститься.
растолкуйте про всплытие.. что такое стек вызовов я знаю.. учили когда то, но что в этом случае "всплытие" не могу понять.. стек вызовов это грубо говоря запоминание в какую функцию ушло приложение.. а зачем тут чему то всплывать?)) Спасибо)
Это так называется то, что я описал. После выбрасывания исключения интерпретатор будет раскручивать стек вызовов в обратном порядке, пока не найдёт обработчик. Из всех остальных функций будет автоматический немедленный выход