Как переслать ошибки, сгенерированные в Bootstrap, в ErrorController? - PullRequest
1 голос
/ 09 апреля 2011

Я использую значение по умолчанию ErrorController, сгенерированное для меня Zend Tool.Самое первое, что делает мой index.php файл, это регистрирует обработчик ошибок, который преобразует ошибки и предупреждения в исключения:

function handleError($errno, $errstr, $errfile, $errline, array $errcontext) {
    // error was suppressed with the @-operator
    if (0 === error_reporting()) {
        return false;
    }

    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}

set_error_handler('handleError');

У меня также это настроено в index.php:

$front = Zend_Controller_Front::getInstance();
$front->throwExceptions(false);

Проблема в том, что он не обрабатывает исключения, которые приходят из файла Bootstrap.Исключение срабатывает, но ErrorController не подхватывает его.Выполнение страницы просто останавливается и никакие представления не отображаются.

Как я могу направить каждое исключение и предупреждение через контроллер ошибок (за исключением, конечно, синтаксических и фатальных ошибок)?

Ответы [ 3 ]

2 голосов
/ 10 апреля 2011

Но если вы подключаетесь к базе данных JIT (Just In Time), проблем быть не должно. Вы можете фактически переместить соединение с базой данных после начальной загрузки, используя плагины Front Controller. Настройка соединения с БД может быть на _dispatchLoopStartup(), если вам не нужно настраивать другие вещи (например, маршруты, некоторые предварительные отправки и т. Д.).

//in bootstrap
$front->registerPlugin(new Awesome_Db_Plugin($zendConfigWithDbOptions));
// in plugin (options injected via constructor to private member
public function dispatchLoopStartup() {
    $db = Zend_Db::factory($this->_options);
    Zend_Registry::set('db', $db);
}

Таким образом, каждое исключение, сгенерированное во время соединения с БД, будет запущено после $front->dispatch();

2 голосов
/ 11 апреля 2011

это из моего index.php, может быть, это будет полезно:

//bootstrap, and run application
try {
    require_once 'Zend/Application.php';
    //create application and configure it.
    $application = new Zend_Application(
        getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production',
        array('config' => array(APPLICATION_PATH . DS . 'configs' . DS . 'application.ini'))
    );
    //run application
    $application->bootstrap()->run();
} catch (Exception $e) {
    //fallback for uncatched exceptions
    ob_clean();
    //ensure error will be logged and firephp backend, if enabled, will send log messages
    if(is_object($application)
        && $application->bootstrap('log')
        && Zend_Registry::isRegistered('Zend_Log')
    ) {
        Zend_Registry::get('Zend_Log')
            ->log($e,Zend_Log::CRIT);
    }
    $wildfire = Zend_Wildfire_Channel_HttpHeaders::getInstance();
    if(!($response = Zend_Controller_Front::getInstance()->getResponse())) {
        $response = new Zend_Controller_Response_Http();
        $wildfire->setRequest(new Zend_Controller_Request_Http());
        $wildfire->setResponse($response);
    }
    if($response->canSendHeaders()) {
        $response->clearHeaders();
        $response->setHttpResponseCode(500);
        $wildfire->flush();
        $response->sendResponse();
    }
    //put static html for error page here
    echo 'Startup error occured. Try again later';
}

note : Zend_Registry::isRegistered('Zend_Log') экземпляр Zend_Log зарегистрирован в реестре в моем расширенном ресурсе приложения

1 голос
/ 10 апреля 2011

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

Вам придется использовать что-то еще, чтобы справиться с этим.

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

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