Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Следует упомянуть что разрабатывая классы эксепшенов мы должны следовать принципу информативного интерфейса. Грубо говоря — учитывать их логический смысл, а не физический. Например, если адреса у нас храняться в файлах, то отсутствие файла адреса вызовет FileNotFoundException. Мы же должны перехватить его и вызвать более осмысленный AddressNotFoundException.
Например, если адреса у нас хранятся в файлах
create_temporary_table();
read_json();
remove_temporary_table();
при отсутствии исключений таблица будет уничтожена всегда, а вот если read_json
кинет исключение — то всё «рассыпется».create_temporary_table
). Вы правы в том смысле, что PHP во многих случаях спасается за счёт того, что за ним «убирает» DBMS (собственно именно этим разработчики PHP годами аргументировали своё нежелание реализовывать final
), но это не значит, что это будет проиходить совсем уж всегда.<? namespace App\Support\Exceptions\Handlers;
use App\Supprot\Exceptions\Contracts\ExceptionHandlerContract;
use App\Supprot\Exceptions\Handlers\DefaultHandler;
class ExceptionHandler implments ExceptionHandlerContract {
protected $defaultHandler = DefaultHandler::class;
protected $customHandlers = [];
public function handle(Exception $e)
{
$exceptionType = get_class ($e);
if(array_key_exists($exceptionType, $this->customHandlers))
{
$handler = new $this->customHandlers[$exceptionType];
return $this->runHandler($handler, $e);
}
return $this->handleDefault($e);
}
protected function handleDefault(Exception $e)
{
$handler = new $this->defaultHandler;
return $this->runHandler($handler, $e);
}
public function addCustomHandler($exceptionClassName , $handlerClassName)
{
$this->customHandlers[$exceptionClassName] = $handlerClassName;
}
public function runHandler(ExceptionHandlerContract $handler, Exception $e)
{
return $handler->handle($e);
}
}
$app->exceptionHandler->addCustomHandler(CustomHandler::class);
rquire_once('../paths.php');
rquire_once(VENDOR_AUTOLAD_PATH);
$app = new App;
try
{
$app->run();
}
catch (Exception $e)
{
$app->exceptionHandler->handle($e);
}
$app = new App;
$app->run();
redirect()->back()->withErrors($validator->errors);
код, утыканный «throw new Exception» — это, как минимум, странно.
Про обработку исключений мало сказано
среди примеров презираемый многими «catch (Exception)
catch (Exception)
и он вовсе не про обработку исключений, а про откат изменений. Поэтому там все верно — именно catch (Exception)
там и должен быть.Просто в контексте тех мест класс эксепшна не так важен как именно его наличие
Это все к мануалу
try {
// something
} catch (Ecxeption $e) {
die($e->message());
}
class InvalidArgumentException extends \InvalidArgumentException implements MyApplicationExceptions {
}
<чуть чуть сарказма>Автор, в 4 абзаце речь идет о стандартах и лучших практиках, как насчет PSR1,2? :)</чуть чуть сарказма>
Правильное использование Exception’ов в PHP