3.5. Операторы exit, die и return
Подобно оператору break, оператор exit обеспечивает возможность прервать выполнение программы, но, в отличие от оператора break, он завершает выполнение программы вообще. При этом в браузер не отсылается никакого диагностического текста. Такой прием полезен в случае возникновения ошибки, когда продолжение выполнения программы грозит гораздо более серьезными последствиями. Это довольно традиционный метод программирования при работе с запросами к базам данных. В этом случае, если оператор SQL не проходит простой синтаксической проверки, нет никакого смысла продолжать его выполнение.
Оператор die аналогичен оператору exit за исключением того, что он снабжается выражением, которое отсылается в браузер перед аварийным завершением работы сценария. Пользуясь тем, что подвыражения обрабатываются в соответствии с приоритетностью и ассоциативностью, и учитывая природу логических операторов, выражение из листинга 3.12 будет допустимо.
| Листинг 3.12. Идиома использования оператора die_
$fp = fopen("somefile.txt", "r") OR die("Нeвозможно открыть файл");
Приоритет оператора OR в листинге 3.12 имеет существенное значение, т.е. его приоритет меньше приоритета оператора присвоения, что позволяет PHP присвоить значение, возвращаемое функцией fopen, переменной fp, а затем обработать выражение OR. Оператор ||, функционально тождественный оператору OR, имеет более высокий приоритет, чем оператор присвоения. В случае применения оператора || в такой ситуации PHP обработает его первым и завершит работу сценария.
В главе 4, "Функции", обсуждается традиционное использование оператора return, но в PHP существует и вариант нетрадиционного использования данного оператора. 
Это происходит при использовании оператора include, описанного в главе 7, "Операции ввода-вывода и доступ к диску". Если его вызов производится вне функции, оператор return останавливает выполнение текущего сценария и возвращает управление сценарию, который вызвал include, т.е. когда в сценарии используется функция include, вложенный сценарий может завершаться преждевременно. При использовании команды return в сценарии, который не был вызван с помощью оператора include, сценарий просто завершит свое выполнение, как это бывает при выполнении оператора exit.
Конечно, можно согласиться с тем, что это довольно странная концепция, но и такой оператор вполне заслуживает своего собственного имени. Но, с другой стороны, в особых случаях он позволяет создавать довольно приличный код.
3.6. Исключительные события
При возникновении ошибки PHP отсылает сообщение об ошибке в браузер. Некоторые ошибки прерывают выполнение сценария. Для обработки ошибок, которые не останавливают выполнение сценариев, их необходимо задавать с помощью функции, указанной с помощью функции set_error_handler. Эта функция подробно описывается в главе 15, "Настройка". Кроме того, можно воспользоваться возможностями функции trigger_error (о ней речь пойдет в главе 9, "Операционная система"), которая позволяет генерировать новые ошибки.
С другой стороны, для решения возникающих проблем можно использовать ис­ключительные события (рис. 3.7). Исключительные события представляют собой объектно-ориентированные ошибочные условия и возникают в контексте оператора try. Для инициирования исключительного события используется оператор throw, затем управление передается блоку catch, который получает копию возникшего исключительного события. Для каждого исключительного события, которое будет перехватываться, необходимо добавить свой собственный блок catch или воспользоваться встроенным классом Exception PHP. Встроенный класс Exception включает два метода: getFile, возвращающий путь к файлу, генерировавшему исключительное событие, и getLine, возвращающий номер строки из этого файла.
При работе с объектно-ориентированными языками (например, Java) концепция исключительного события аналогична. Если же вы предпочитаете процедурный тип программирования, такой подход работать не будет. В листинге 3.13 продемонстрировано использование исключительных событий. Объекты детально обсуждаются в главе 6, "Классы и объекты". Если у вас нет никакого опыта работы с объектами, вернитесь к данному материалу после подробного изучения главы 6, "Классы и объекты".
Операторы управления
j Листинг 3.13. Использование оператора try_
<?php
// Вывести математическое выражение из основного класса class mathException extends Exception
{
public $type;
public function __construct($type)
{
// Принять имя файла и номер строки
parent::Exception();
$this->type = $type;
}
}
// Попробовать операцию деления $numerator = 1; $denominator = 0; try
{
// Запустить исключительное событие "деление на нуль" if($denominator == 0)
{
throw new mathException("Division by zero");
}
print($numerator/$denominator);
}
catch(mathException $e)
{
// Мы перехватили математическое исключительное событие print(" Перехват математического исключительного события ($e->type) in " .
"$e->file on line $e->line<br>n");
}
catch(Exception $e)
{
// Мы перехватили исключительное событие другого типа print("Пepeхват исключительного события в " . $e->file() . " on line " . $e->line() . "<br>n");
}