Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
а теперь тебе нужно реализовать артефакт, который в случае недостатка манны для совершения какого-либо действия единократно пополняет её запас и разрушается. но только если действие совершится. как ты его присунешь в свою модель с исключениями?
function useArtefact($player, $artefact) {
try {
$artefact->use();
throw new AppErrorExceptionTranslate("мы не должны были здесь оказаться");
} catch (OkExceptionTranslate $ok) {
$player->money -= $artefact->price;
try {
$player->save();
} catch (OkExceptionTranslate $ok) { //удачно сохранили состояние игрока в БД
throw new OkExceptionTranslate("артефакт использован круто");
}
} catch (DbException $e) {
throw new FailExceptionTranslate("ошибка повторите через 5 минут");
} //catch (MoneyException $e) { - MoneyException b ManaException пусть пробрасываются дальше
throw new AppErrorExceptionTranslate("мы не должны были здесь оказаться");
}
try {
//
// редактирование профиля
//
} catch (AuthException $e) {
// надо быть авторизированным
} catch (AccessException $e) {
// надо иметь доступ
} catch (ValidationException $e) {
// надо правильно заполнять форму
} catch (ApplicationException $e) {
// таки shit happens
}
try {
$object->method();
} catch(InvalidArgumentException $exception) {
error_log('Переданы неверные аргументы');
} catch(LogicException $exception) {
error_log('Логическая ошибка подпрограммы');
}При этом если InvalidArgumentException отнаследован от LogicException — то до блока обработки LogicException дело не дойдет, потому как блоки исполняются поочередно, до тех пор пока не будет исполнен хотя-бы один, или пока не закончатся блоки, и проверка типа в них полностью аналогична instanceof.} catch(WeAreDoomedException $exception) {
// когда-нибудь надо дописать обработку
}if(!array_key_exists($message, $translate)){
return $message;
} else {
return $translate[$message];
}
if(!array_key_exists($message, $translate)){
log($message, 'untranslated string');
return $message;
} else {
return $translate[$message];
}
try{
//...
} catch(myException $e) {
//...
} catch(Exception $e) {
//здесь вы можете поймать все, что не поймали раньше
}
Взято отсюда
Любой объект уже обладает типом. Этим типом является его класс. Внедряя информацию о типе в сам класс, вы можете нарушить принцип открытия/закрытия…
Как сделать лучшую архитектуру
…
Принцип открытия-закрытия (Open-Closed Principle) – классы должны быть открыты для расширений, но закрыты для модификаций. Кажется, что это невозможно, однако стоит вспомнить шаблон проектирования Strategy и становится более или менее понятно.
…
пусть у нас есть модуль А, он использует модули Б, Ц и Д, каждый из которых бросает однотипные исключения (например, не могу открыть файл), но каждый называет его по своему. поэтому модулю А приходится их перехватывать и заворачивать в своё «не могу открыть файл». в результате у нас получается 4 имени для одного и того же исключения. зачем?
почему я могу перехватить все исключения вызываемого мной модуля, но не могу перехватить все исключения связанные с файловой системой?
пусть у нас есть модуль А, он использует модули Б, Ц и Д, каждый из которых бросает однотипные исключения (например, не могу открыть файл), но каждый называет его по своему. поэтому модулю А приходится их перехватывать и заворачивать в своё «не могу открыть файл». в результате у нас получается 4 имени для одного и того же исключения. зачем?
а что если нам нужно перехватывать «проблемы с файлами» и «проблемы с базой» и для этих случаев выполнить один и тот же код, а для других проблем — другой? синтаксис catch( ExcaptionName $e ) тут уже не рулит, ибо эта задача не вписывается в «единую иерархию»
interface myDbFileException {}
class fileException extends baseException implements myDbFileException{}
class dbException extends baseException implements myDbFileException{}
Исключения должны проектироваться не от кода, а от ситуаций,
которые вы хотите по-особенному обработать.
The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.
Правильная работа с исключениями в PHP