Новые книги

Розничные компании и их Private labels, т. е. собственные торговые марки, завоевывают новые ниши на рынке. Но производители традиционных брендов по-прежнему создают стратегии, основанные на отживших мифах и представлениях о собственных марках розничных сетей. Если производители традиционных брендов не хотят проиграть, им жизненно необходим совершенно другой подход. Авторы книги развенчивают устойчивые мифы о марках розничных сетей, описывают новые, многоуровневые стратегии, которые розничные сети используют в отношении собственных марок, и предлагают производителям разработать эффективные ответные меры. Авторы призывают производителей принять брошенный вызов и идти в атаку! Основанная на исследовании эмпирического материала, собранного в разных странах мира, и на беспрецедентном обзоре мнений потребителей и анализе статистики книга содержит стратегии действий и производителей, и торговых сетей. Авторы предоставляют инструментарий, который поможет успешно конкурировать – или сотрудничать – с поставщиками товаров под марками розничных сетей; объясняют, почему сейчас производители традиционных брендов должны считаться с марками розничных сетей. Книга будет интересна руководителям производственных и торговых компаний, маркетологам, экспертам. Читатели найдут в книге много интересных фактов об известных магазинах и товарах.
Вниманию читателя предлагается двадцать увлекательных интервью Иосифа Гольмана с российскими и зарубежными мастерами рекламы: Олегом Ощепковым, Эркеном Кагаровым, Петером Небелем, Владом Васюхиным, Ириной Морозовой, Алексеем Голиковым и другими. В суждениях, примерах из жизни, биографиях известных в нашей стране профессионалов как в зеркале отражаются не только история, но и состояние, болевые точки, потенциал и перспективы современной российской рекламы.

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

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

Учебник РНР
Назад Вперёд

Глава 15. Обработка ошибок

В РНР есть несколько типов ошибок и предупреждений:

Таблица 15-1. Типы ошибок PHP
Значение КонстантаОписаниеПримечание
1E_ERROR фатальные ошибки времени выполнения 
2E_WARNING предупреждения времени выполнения (нефатальные ошибки) 
4 E_PARSEошибки разбора времени компиляции 
8 E_NOTICE уведомления времени выполнения (менее серьёзные, чем предупреждения)  
16E_CORE_ERRORфатальные ошибки при начальном старте PHP только PHP 4
32E_CORE_WARNINGпредупреждения (нефатальные ошибки) при начальном старте РНР только PHP 4
64E_COMPILE_ERRORфатальные ошибки времени компиляции только PHP 4
128E_COMPILE_WARNINGпредупреждения времени компиляции (нефатальные ошибки) только PHP 4
256E_USER_ERRORгенерируемое пользователем сообщение об ошибке только PHP 4
512E_USER_WARNINGгенерируемое пользователем предупреждение только PHP 4
1024E_USER_NOTICE генерируемое пользователем уведомление только PHP 4
 E_ALLвсё вышеуказанное, как поддерживаемое  

Вышеуказанные значения (цифровые или символьные) используются для построения битовой маски, которая специфицирует выводимое сообщение об ошибке. Вы можете использовать битовые операции для маскирования определённых типов ошибок. Обратите внимание, что только  '|', '~', '!' и '&' будут понятны в php.ini и что никакие битовые операции не будут понятны в php3.ini.

В PHP 4 значением по умолчанию для error_reporting будет E_ALL & ~E_NOTICE, что означает отображение всех ошибок и предупреждений, которые не имеют уровень E_NOTICE-level. В PHP 3 значение по умолчанию (E_ERROR | E_WARNING | E_PARSE) означает то же самое. Заметьте, однако, что, поскольку константы не поддерживаются в PHP 3 в файле php3.ini, установка error_reporting должна выполняться цифрами; то есть 7 по умолчанию.

Начальное значение может быть изменено в ini-файле директивой error_reporting, в вашем Apache httpd.conf-файле директивой php_error_reporting (php3_error_reporting для PHP 3) и, наконец, оно может быть установлено на этапе прогона скрипта функцией error_reporting().

Предупреждение!

При обновлении кода или серверов с PHP 3 до PHP 4 вы должны проверить эти установки и вызовы error_reporting(), либо можете отключить вывод сообщений о новых типах ошибок, особенно о E_COMPILE_ERROR. Это может привести к появлению пустых документов без какого-либо сообщения о причине и месте возникновения проблемы.

Все выражения РНР могут также вызываться с префиксом "@", который отключает сообщения об ошибках для данного конкретного выражения. Если ошибка возникает в ходе вычисления такого выражения и track_errors включена, вы можете найти сообщение об ошибке в глобальной переменной $php_errormsg.

Примечание: префикс @ error-control-операции не отключает вывод сообщений, которые являются результатом ошибок разбора.

Предупреждение!

В настоящее время префикс @ error-control-операции отключает даже сообщения о критических ошибках, которые прерывают выполнение скрипта. Помимо прочего, это означает, что, если вы используете @ для подавления ошибок из определённой функции и она недоступна или неправильно написана, скрипт накроется без указания причины.

Ниже дан пример использования возможностей РНР по обработке ошибок. Мы определяем функцию обработки ошибок, которая записывает лог-информацию в файл (используя XML-формат) и уведомляет разработчика по e-mail при возникновении критической ошибки в логике.

Пример 15-1. Обработка ошибок в скриптах
<?php
// делаем нашу собственную обработку ошибок
error_reporting(0);

// пользовательская функция обработки ошибок
function userErrorHandler ($errno, $errmsg, $filename, $linenum, $vars) {

    // штамп времени для вхождения ошибки
    $dt = date("Y-m-d H:i:s (T)");

    // определяем ассоциативный массив строки ошибки;
    // в реальности мы должны рассматривать только
    // 2,8,256,512 и 1024
    $errortype = array (
                1   =>  "Error",
                2   =>  "Warning!",
                4   =>  "Parsing Error",
                8   =>  "Notice",
                16  =>  "Core Error",
                32  =>  "Core Warning!",
                64  =>  "Compile Error",
                128 =>  "Compile Warning!",
                256 =>  "User Error",
                512 =>  "User Warning!",
                1024=>  "User Notice"
                );
    // установить ошибки, для которых vartrace будет сохраняться
    $user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
    
    $err = "<errorentry>\n";
    $err .= "\t<datetime>".$dt."</datetime>\n";
    $err .= "\t<errornum>".$errno."</errornum>\n";
    $err .= "\t<errortype>".$errortype[$errno]."</errortype>\n";
    $err .= "\t<errormsg>".$errmsg."</errormsg>\n";
    $err .= "\t<scriptname>".$filename."</scriptname>\n";
    $err .= "\t<scriptlinenum>".$linenum."</scriptlinenum>\n";

    if (in_array($errno, $user_errors))
        $err .= "\t<vartrace>".wddx_serialize_value($vars,"Variables")."</vartrace>\n";
    $err .= "</errorentry>\n\n";
    
    // для тестирования
    // echo $err;

    // сохранить в error log и e-mail, если имеется критическая пользовательская ошибка
    error_log($err, 3, "/usr/local/php4/error.log");
    if ($errno == E_USER_ERROR)
        mail("[email protected]","Critical User Error",$err);
}


function distance ($vect1, $vect2) {
    if (!is_array($vect1) || !is_array($vect2)) {
        trigger_error("Incorrect parameters, arrays expected", E_USER_ERROR);
        return NULL;
    }

    if (count($vect1) != count($vect2)) {
        trigger_error("Vectors need to be of the same size", E_USER_ERROR);
        return NULL;
    }

    for ($i=0; $i<count($vect1); $i++) {
        $c1 = $vect1[$i]; $c2 = $vect2[$i];
        $d = 0.0;
        if (!is_numeric($c1)) {
            trigger_error("Coordinate $i in vector 1 is not a number, using zero", 
                            E_USER_WARNING);
            $c1 = 0.0;
        }
        if (!is_numeric($c2)) {
            trigger_error("Coordinate $i in vector 2 is not a number, using zero", 
                            E_USER_WARNING);
            $c2 = 0.0;
        }
        $d += $c2*$c2 - $c1*$c1;
    }
    return sqrt($d);
}

$old_error_handler = set_error_handler("userErrorHandler");

// неопределённая константа, генерируется предупреждение
$t = I_AM_NOT_DEFINED;

// определяем некоторые "векторы"
$a = array(2,3,"foo");
$b = array(5.5, 4.3, -1.6);
$c = array (1,-3);

// генерируется пользовательская ошибка
$t1 = distance($c,$b)."\n";

// генерируется ещё одна пользовательская ошибка
$t2 = distance($b,"i am not an array")."\n";

// генерируется предупреждение
$t3 = distance($a,$b)."\n";

?>

Это лишь простой пример, показывающий, как использовать Функции обработки ошибок и логинга.

См. также error_reporting(), error_log(), set_error_handler(), restore_error_handler(), trigger_error(), user_error()


Назад Оглавление Вперёд
Возможности Вверх Создание изображений
и работа с ними