Обработка ошибок в PHP - PullRequest
       13

Обработка ошибок в PHP

4 голосов
/ 29 апреля 2010

Мы создаем приложение PHP на основе старой доброй платформы codeigniter и столкнулись с проблемой массивного связанного действия, состоящего из нескольких вызовов модели, которые вместе являются частью большой транзакции с базой данных.

Мы хотим иметь возможность выполнить список действий и получить отчет о состоянии каждого из них обратно из функции, независимо от результата.

Нашей первой первоначальной идеей было использование исключений PHP5, но, поскольку нам также нужны сообщения о состоянии, которые не нарушают выполнение скрипта, это было наше решение, которое мы придумали.

Это выглядит примерно так:

$sku = $this->addSku( $name );

if ($sku === false) {
    $status[] = 'Something gone terrible wrong';
    $this->db->trans_rollback();
    return $status;
} 

$image= $this->addImage( $filename);

if ($image=== false) {
    $error[] = 'Image could not be uploaded, check filesize';
    $this->db->trans_rollback();
    return $status;
} 

Наш контроллер выглядит так:

$var = $this->products->addProductGroup($array);

if (is_array($var)) {

    foreach ($var as $error) {
        echo $error . '<br />';
    }

}

Похоже, это очень хрупкое решение, чтобы делать то, что нам нужно, но оно ни масштабируемое, ни эффективное по сравнению, например, с исключениями из чистого PHP.

Это действительно способ, которым подобные вещи обычно обрабатываются в приложениях на основе MVC?

Спасибо!

UPDATE: Сделали немало поисков и нашли эту функцию PHP: register_shutdown_function. Может ли это быть то, что мы ищем? У меня нет идеи, и я не могу заставить ее работать так, как мы хотим ... Справка: http://php.net/manual/de/function.register-shutdown-function.php

1 Ответ

2 голосов
/ 29 апреля 2010

Вы можете установить собственный обработчик исключений в PHP - http://php.net/manual/en/function.set-exception-handler.php

Это позволит сценарию продолжить выполнение. Вы можете создать функцию, которая регистрирует статус в базе данных. Другая функция и / или класс могут получить их для обновления текущего отчета о состоянии. Если вы выбрасываете пользовательское исключение, то есть выбрасываете StatusException, ваш пользовательский обработчик может выбрать тип исключения и зарегистрировать его соответствующим образом, выполняя действия по умолчанию для других стандартных исключений ...

В качестве альтернативы использованию базы данных вы можете использовать обработчик исключений для сохранения информации в объекте сеанса и т. Д., К которому можно будет обращаться позже только для текущего сеанса.

Если использование обработчика исключений является правильным, я все еще не уверен, поскольку я все еще немного неопределен в том, что вы пытаетесь сделать, но мой метод позволит продолжить выполнение кода при обработке исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...