Задать вопрос

Можно ли организовать централизованное управление ошибками в данном случае?

добрый день у меня есть такой интерфейс:
interface Entities extends \Iterator
{
    /**
     * @return Entity[]
    */
    public function list(): array;

    /**
     * @param Form $form - форма, которая выдает провалидированные данные
     * @return Entity - Проблема которую нужно решить
     */
    public function addFromInput(Form $form): Entity;
}


вопрос, если я в методе addFrimInput($form) выброшу исключение. то можно ли как то написать какую либо обертку или общее место обработки исключений?
проблема у меня заключается в том что метод должен что то возвращать и не просто что-то а сущность.
была мысль выкидывать NullObject,
но если я выкину ошибку на уровне ниже (ошибка валидации формы, например) - то тут уже не выведешь NullObject. т.к. ошибка к объекту не имеет никакого отношения.
try{
//программа работает нормально
}
catch(Exception){
//тут должен вернуть сущность Entity
}

Обработку исключений в экшенах - не рассматриваю из за сильной привязки к фреймворку. хотелось бы все сделать в своих объектах.
  • Вопрос задан
  • 251 просмотр
Подписаться 4 Простой 3 комментария
Решения вопроса 2
Ichi
@Ichi
Увлекаюсь программированием
Можно же ловить отдельно определенные исключения, так же есть блок finally, который выполнится в любом случае.

try {
    // код
} catch (ICreateNewException $e) {
    echo 'Сработало исключения создания: ',  $e->getMessage(), "\n";
} catch (Exception $e) {
    echo 'Поймано исключение: ',  $e->getMessage(), "\n";
} finally {
    echo "Это я выполню всё равно";
}


чтобы так не писать каждый раз, можно создать функцию, в которую передавать callbak'ом функцию
// это примерный код просто для визуального примера
function ($callback, $args,$default)
{
try {
  $r = $callback($args);
// or call_user_func(array($callback, $args))
} catch (ICreateNewException $e) {
    echo 'Сработало исключения создания: ',  $e->getMessage(), "\n";
return new NullObj;
} catch (Exception $e) {
    echo 'Поймано исключение: ',  $e->getMessage(), "\n";
mail(config('mail.to'))
} finally {
    return $default;
}
}
Ответ написан
Azurre
@Azurre
Web Developer
class Entity {
}

class EntityException extends \Exception {
    private $entity;

    public function getEntity() {
        return $this->entity;
    }

    public static function create($entity, $message = 'Error', $code = 0)
    {
        $exception = new static($message, $code);
        $exception->entity = $entity;
        return $exception;
    }
}


try {
    throw EntityException::create( new Entity, 'Internal error' );
} catch(\EntityException $e) {
    // Handle entity exceptions
    echo $e->getMessage() . PHP_EOL;
    var_dump($e->getEntity());
} catch(\Throwable $e) {
    // Handle other exceptions
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы