yii слишком строг к ошибкам

Здравствуйте!

Yii слишком строго относится к ошибкам (без yii - notice - и работает дальше)

пример


<?php

        $yii='/ebsmnt1/YII/yii-1.1.10.r3566/framework/yii.php';

        $config='/ebsmnt1/www/trenazhery/manage/admin-yii/protected/config/main.php';

        require($yii);

        Yii::createConsoleApplication($config);

//        $s = "Ok.";

        $n = "This is:".$s."\n\n";

        echo $n;

?>



и выполнение остановлено

Без Yii:


<?php

//        $s = "Ok.";

        $n = "This is:".$s."\n\n";

        echo $n;

?>



Как видим php выдал notice - и прекрасно отработал дальше (строчка "This is:")

Как сделать, что бы yii отрабатывал также?

Спасибо.

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


; error_reporting

;   Default Value: E_ALL & ~E_NOTICE

;   Development Value: E_ALL | E_STRICT

;   Production Value: E_ALL & ~E_DEPRECATED



Но… Собственно говоря, NOTICE для того и добавлены в PHP, чтобы исключать ощибки подобные вашему примеру. Проинициализиров одну переменную и использую далее по невнимательности другую, вам будет обеспечен квест по поиску, что и где пошло не так, как вы ожидали…

To Sergejs: вопрос поставлен не в том, что бы скрыть нотисы, а что бы они не считались "fatal error". Это очень разные вещи.

To kolossus: странно, но у меня Yii себя не ведет так строго. Собственно говоря я даже затрудняюсь заставить её выводить нотисы, наверное для этого нужно менять php.ini, не то что бы прекращать выполнение.

А ты случайно свои обработчики ошибок не устанавливал? Уж очень симптомы на использование set_error_handler похожи.

А если сгенерировать новое приложение с нуля, в нем тоже нотисы будут приводить к остановке выполнения?

Свои обработчики не устанавливал.

Новое приложение - аналогично.

Проблему решил как указано постом выше, хотя и не так, что хотелось.

Скрыл нотисы - и все ок. Но хотелось бы их видеть, главное чтобы не фатал. Почему без yii - все нормально, проверял, пишет нотис и дальше работает?

Частично согласен, но выплыло при использовании сторонней библиотеки.

Да и нотис для того, чтобы обратить внимание - а не остановить выполнение скрипта.




if($rrc != 0) $q = " AND rrc='".intval($rrc)."'";

. . .

$query = "SELECT * FROM `base` WHERE user_id='".intval($user)."' ".$q;



И почему так нельзя?

Я решил присоедениться к вопросу. Нашел похожую тему тут в ней тоже никто ответа дать не смог и все скатилось в "лучше писать так, что бы нотисы не валились, - но как сделать что бы нотисы не останавливали выполнение скрипта?! - … "

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

И что самое обидное- экранирование собачкой не устраняет этот нотис!

Кто знает решение?

Привыкайте писать нормальный код.

Вопрос был "как выводить нотисы, но не останавливать ими работу скрипта, или хотя что бы экранированные собачкой случаи не приводили к остановке программы".

А это значит "так сделать невозможно потому-то таков РНР и его set_error_handler" или "мы специально так сделали что бы вы приучались писать правильный код"?

Скорее второе. Так-то отключить error handler Yii возможно. Правда, пропадут все его возможности для отладки.

неужели нельзя сказать Yii - просто игнорировать Notice?

такой простой вопрос, неужели разработчики забили на это?

Lebnik

notice в большинстве случаев — штука очень злая и оставлять её в коде неприемлимо.

согласитесь, что если разработчики PHP сделали Notice, сделали возможность его отключить, то я должен иметь эту возможность! Иначе, следуя Вашей логике, разработчики PHP перемудрили, Notice можно было не делать, пусть относятся к полноценным ERROR. Так давайте напишем им в багтрэк, пусть они исправят этот косяк, в Yii ведь его исправили! да? :rolleyes: или может быть Yii все таки может быть таким же гибким как PHP?

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

На мой взгляд Yii во многом позволяет скрыть недостатки php, а возможность отключения notice для меня именно недостаток, а не гибкость.

По сути - смотрите схему обработки ошибок - если установить константу YII_ENABLE_ERROR_HANDLER в false, то notice, warining и т.д. будут обрабатываться самим php.

Другой вариант - переопределить CApplication::handleError и для notice вывести ошибку, но не завершать приложение.

  1. Ну это Ваше личное мнение и думаю очень многие с Вами не согласны

  2. Тогда зачем на нем писать Yii? выбрали бы другой язык, более правильный :)

Yii вроде как создан для удобства или может я ошибаюсь и его создали для урезания функционала PHP? Я только знакомлюсь с Yii, может в нем меня ждет еще много подобных сюрпризов? Очень надеюсь что нет, ведь очень многие хвалят его!

define(‘YII_ENABLE_ERROR_HANDLER’,false); - к сожалению, это не позволяет php обрабатывать notice, warining и т.д. самому, иначе бы я не продолжал здесь дискусию, а те кто писал Выше, думаю не заводили бы эту тему.


<?php


define('YII_ENABLE_ERROR_HANDLER',false);


require(dirname(__FILE__).'/YiiRoot/framework/yii.php');

Yii::createWebApplication(dirname(__FILE__).'/protected/config/main.php')->run();



Может быть я применяю эту константу неправильно или пишу в ненадлежащем месте?

Подскажите пример с переопределением CApplication::handleError для игнорирования notice?

Это Вы так считаете, я так не считаю, наши мнения расходятся наверное потому что Вы не смогли объяснить, свою позицию на примере. Не имею ввиду мнения Ваши и мои, а имею ввиду мнение тех кто писал Выше (тех, кто думает так же как я). Без обид, просто объясню, обратите внимание, они аргументированно показали Вам код и возможно ждали от Вас подобного ответа, как от более профессионального знатока. Коем, как я понял Вы и являетесь, ведь Вы написали книгу по Yii, а это очень серьезно.

Я тоже последую ребятам и приведу пример:


<?php

$z = $_GET['z']? 1 : 0;

вот объясните, что злого в этом коде, что здесь неприемлемо?

Не всегда можно выбирать то что нравится )). Тем более, что я не считаю php плохим языком - только не очень безопасным. И Yii помогает избежать многих острых углов.

Константу определяйте в index.php, править код самого фреймворка - тоже плохая затея.

Вот так у меня php notice выводится:




<?php

// change the following paths if necessary

$yii=dirname(__FILE__).'/../.............../yii.php';

$config=dirname(__FILE__).'/protected/config/main.php';


// remove the following lines when in production mode

defined('YII_DEBUG') or define('YII_DEBUG',true);

// specify how many levels of call stack should be shown in each log message

defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);


defined('YII_ENABLE_ERROR_HANDLER') or define('YII_ENABLE_ERROR_HANDLER',false);


require_once($yii);

$app = Yii::createWebApplication($config);

//        $s = "Ok.";

        $n = "This is:".$s."\n\n";

        echo $n;

$app->run();



Всё что я писал, я писал в index.php, код фрэймворка я не трогал.

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

Так зачем вы вообще тогда дискуссию затеяли… Как вернуться к стандартному поведению php (исходный вопрос в топике) - я показал.

Хотите игнорировать notice’s - отключите его в php.ini или в htaccess - это к Yii вообще никакого отношения не имеет.

Хотя это в любом случае плохая практика, советую все таки прислушаться к совету samdark. Ошибки нужно исправлять, а не прятать, а использование неинициализированной переменой - это ошибка.

И, кстати, посмотрел сейчас в рассылке форума - по поводу этого:

Хм… Зачем вы в таком случае свой пост подправили?

Сейчас так:




define('YII_ENABLE_ERROR_HANDLER',false);


require(dirname(__FILE__).'/YiiRoot/framework/yii.php');

Yii::createWebApplication(dirname(__FILE__).'/protected/config/main.php')->run();



Было так:





define('YII_ENABLE_ERROR_HANDLER',false);


require(dirname(__FILE__).'/YiiRoot/framework/YiiBase.php');

class Yii extends YiiBase

{

}

Yii::createWebApplication(dirname(__FILE__).'/protected/config/main.php')->run();




Или это у вас index.php такой?

А я уж думал require(…YiiBase.php) мне почудился.

Это я для наглядности поправил, чтобы Вам не казалось, что я правил исходники Yii.

Чтобы доказать это, просто сами загляните в /YiiRoot/framework/yii.php и увидите там:


require(dirname(__FILE__).'/YiiRoot/framework/YiiBase.php');

class Yii extends YiiBase

{

}

так что, я ничего в исходниках не менял, надеюсь вопрос изменения исходников Yii исчерпан (всех просим извинить за оффтоп).

А теперь по существу

  1. Доступа к php.ini у меня нет (следовательно поменять его не смогу)

  2. В htaccess error_reporting назначить E_ERROR|E_PARSE|E_COMPILE_ERROR я тоже не могу

  3. Моя практика говорит мне, что это стандартная ситуация на большинстве недорогих хостингов.

Теперь по поводу Вашего совета:

  1. К примеру: Notice: Undefined index: z - это не ошибка, а Notice!

  2. Пожалуйста, не учите меня PHP, я ведь не спрашиваю как кодить, я спрашиваю как работать с Yii.

Надеюсь не обидел Вас своим постом, а то люди разные бывают, думают что я просто так спрашиваю или хочу показаться умнее. А я ведь всего лишь хочу, чтобы Yii прислушался моих E_ERROR|E_PARSE|E_COMPILE_ERROR

Поэтому еще раз вопрос, я хочу не выводить notice (игнорировать их), как сделать, чтобы Yii меня услышал?

Варианты я описал выше.

Вы просите не учить вас программировать, но хотите добиться готового решения?

Я просто опасаюсь, что ответ принесет больше вреда, чем пользы, так как игнорировать ошибки это в принципе неправильно.

Lebnik, вас я переубедить не надеюсь.

Для остальных, кто читает топик - при разработке используйте "error_reporting = E_ALL | E_STRICT".