Словить notice

MiksIr

miksir@home:~$
Прошу прощения за тупой вопрос, но цейпнот + заболел по ходу.

В общем есть soapclient вызов. Он кидает notice (SoapClient::__doRequest(): send of 8192 bytes failed with errno=32 Broken pipe). Мне нужно залогировать этот нотис и проигнорировать его (а вернее выбросить эксепшн, который дальше лоивится, логируется и игнорируется).

Все это в Yii консольном приложении, yii ловит этот notice и териминирует скрипт. Меня в приципе это устраивает, за исключением именно этого случая... вот я думаю как мне это словить...

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

A1x

Новичок
я сделал так, чтобы на все ошибки кидались исключения

PHP:
class ConsoleApplication extends CConsoleApplication
{

    public function handleError($code, $error, $file = NULL, $line = NULL)
    {
        if (error_reporting() & $code) {
            throw new ErrorException($error, $code, 0, $file, $line);
        }
        // Do not execute the PHP error handler
        return TRUE;
    }

}
 

fixxxer

К.О.
Партнер клуба
А что, этот ваш yii сам даже ошибки в исключения заворачивать не умеет?
 

MiksIr

miksir@home:~$
В режиме разработки он останавливает скрипт и генерит html c ошибкой, трейсом и тому подобное. Как в общем большинство фреймворков.
 

A1x

Новичок
а, я тоже удивился этому факту когда столкнулся, но вышенаписанная переделка все решает
 

fixxxer

К.О.
Партнер клуба
В режиме разработки он останавливает скрипт и генерит html c ошибкой, трейсом и тому подобное. Как в общем большинство фреймворков.
Извращение какое. Есть масса ситуаций, когда возможность warning-а неизбежна, и его надо ловить ниже по коду - тут все решают как раз исключения.

Фреймворк должен ловить исключение на самом верху и, в зависимости от настроек среды, показывать и/или логировать.

Зато картинки на unhandled exception нарисованы красивые. Видимо для тех, кто программирует в notepad-е.

Очень странный этот ваш yii
 

MiksIr

miksir@home:~$
Мне странно другое - с какой радости SoapClient бросает notice на в общем фатальную ошибку. Ну в общем посмотрим как с собакой будет жить.
 

fixxxer

К.О.
Партнер клуба
Здесь был бы более уместен warning, да.

Хотя лично я все php errors рассматриваю как исключения. При нормально написанном коде notice требует не меньшего внимания, чем warning.
 

MiksIr

miksir@home:~$
А... упустил как-то пост. Ну.. на самом деле нормальное решение, да. Попробую щас. Правда, оно не поможет когда нужно "заигнорить" определенный нотис, а остальные не трогать. Но мне подойдет, спасибо.
 

fixxxer

К.О.
Партнер клуба
Заигнорить notice не нужно хотеть, но если хочется, можно поставить собаку.

Я предпочитаю кидаться иерархией Error/Warning/NoticeException, это позволяет словить только требуемое:

PHP:
//Мне нужно залогировать этот нотис и проигнорировать его

$result = null;
try {
   $result = doSomeSoapCalls();
} catch (PhpNoticeException $e) {
   $logger->logException($e);
}
 

Ragazzo

TDD interested
A1x
в таких случаях обычно
PHP:
YII_ENABLE_ERROR_HANDLER
кидают в false.
fixxxer
ну никто же не мешает как и говорили по false кидать эксепшн, так наверное даже правильнее... :S
 

fixxxer

К.О.
Партнер клуба
Исключение с текстом "soapclient returned false" как-то не особо осмысленно, в notice куда больше полезной информации.

Правильнее все php errors рассматривать как исключения: продолжение работы после выкинутого warning/notice в 99% случаев бессмысленно, если нет кода его обработки. Для 1% случаев пишется catch.

(Здесь можно развести дискуссию о том, что WarningException/NoticeException малоосмысленны, и куда лучше бы было иметь четко типизированные исключения, как в python или java - ну что поделать, таков php.)
 

Ragazzo

TDD interested
Я написал что константу YII_ENABLE_ERROR_HANDLER ставят в false( чтобы не перебивать тупо хэндлер ошибок, там много чего может быть в нем кастомного, ага :) ) а не исключение кидают с сообщением что что-то false :D
fixxxer
что поделать, похапе жэ :)
 

cDLEON

Онанист РНРСlub
В режиме разработки он останавливает скрипт и генерит html c ошибкой, трейсом и тому подобное. Как в общем большинство фреймворков.
Чё прям echo $error_msg; exit; ?????
Странный этот ваш Yii.... По-моему, он должен был ловить эти ошибки уровнем выше.
 

Ragazzo

TDD interested
cDLEON
По-моему, он должен был ловить эти ошибки уровнем выше.
на каком, м? Может стоит самому разобраться прежде чем кричать "пожар" и посмотреть как можно сконфигурировать все что нужно, в том числе и обработку ошибок?
 

cDLEON

Онанист РНРСlub
Ragazzo
Банально лениво лезть сорцы Yii. Своего кода и багов предостаточно :))
Каком-каком... На уровне обработки запроса. Словили exception - показали страницу отладки.
Но если программист знает, что вот здесь может вылезти notice, он может перекрыть его всплытие через try...catch у себя в коде. Это должно быть из коробки.
 

Ragazzo

TDD interested
cDLEON
Может ты лучше слазаешь в сорцы и не будешь пороть горячку, и посмотришь еще что выше писали до тебя, ага? :)
 

cDLEON

Онанист РНРСlub
Всё, что выше - читал. Не понял к чему ты :(. Ну разве что там консольное приложение. Только вот в чём разница КАКОЕ это приложение? Только вьюха другая, да на вход переменные из другого места поступают.
 
Сверху