Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Например, если мой движок не может подключиться к БД, то это ошибка. Всё. Точка. Без БД сайт не работает, и я не могу с этим ничего сделать. Поэтому я вызываю ales_kaput() и trigger_error()
<?php
try {
$db = Zend_Db::factory(...);
$db->getConnection();
} catch (Zend_Db_Adapter_Exception $e) {
trigger_error(...); // Универсальная штука,
// которая отправляет мне сообщения
// об ошибках с трейсами и дампами.
}
Пример с БД не самый лучший, так как относится к универсальной библиотеке.
<?php
try {
Application::init()
} catch (Exception $e) {
// Универсальная штука,
// которая отправляет мне сообщения
// обо всех не отловленных эксепшенах с трейсами и дампами.
}
Невозможно отказаться от myErrorHandler потому что он обрабатывает стандартные сообщения php об ошибках (Undefined variable, и т.п.). Придётся в нём продублировать функционал универсальной штуки?
static function execueController(...) {
if (...) {
// не удалось найти класс-контроллер.
// Эта ситуация никогда не может
// возникать, если роутер настроен правильно.
}
}
trigger_error("The " . __METHOD__ . " method is deprecated
and will be dropped in 2.0.", E_USER_NOTICE);
Для этого у меня уже написана функция myErrorHandler(). По этому я ловлю исключение от Zend_Db и вызываю trigger_error().
Теперь я чётко знаю, где использовать trigger_error(), а где throw new Exception()
if ($x === 0) {
throw new Exception('Делить на ноль нехорошо');
} нормальный результат, если метод возвращает null или false, когда ничего не найдено
x = sample_db_query(…)
if (x != false) … else …try {
if ($object = $adapter->findById($objectId)) {
} elseif ($object = $adapter->findByName($objectId)) {
} else {
return null;
}
}
catch (Adapter\Exception $e) {
throw new Exception("Adapter error", Exception::ADAPTER_ERROR, $e)
}
try {
$object = $adapter->findById($objectId
}
catch (Adapter\Exception $e) {
if ($e->getCode() != Adapter\Exception::NOT_FOUND) {
throw new Exception("Adapter error", Exception::ADAPTER_ERROR, $e)
}
else {
try {
$object = $adapter->findById($objectId
}
catch (Adapter\Exception $e) {
if ($e->getCode() != Adapter\Exception::NOT_FOUND) {
throw new Exception("Adapter error", Exception::ADAPTER_ERROR, $e)
} else {
throw new Exception("Object not found", Exception::NOT_FOUND, $e)
}
}
}
return $object;
}
try {
try {
$obj = $ad->getById();
} catch (Adapter\Exception $e) {
$obj = $ad->getByName();
}
} catch (Adapter\Exception $e) {
throw new ApplicationException('Все плохо', ApplicationException::NOT_FOUND, $e);
}Some some = Some.get();
if (some != null) {}Перехватывайте, оборачивайте, и кидайте дальше.

Исключение != ошибка