Почему этот код:Почему geoip выбрасывает исключение?
geoip_country_code_by_name('unknown');
генерировать ErrorException, когда должен вернуться ложным?
Почему этот код:Почему geoip выбрасывает исключение?
geoip_country_code_by_name('unknown');
генерировать ErrorException, когда должен вернуться ложным?
Это ошибка в пакете GeoIP и не фиксируется в любом выпуске (< = 1.0.8). Однако он зафиксирован в багажнике (see this revision). Вы можете решить эту проблему, скомпилировав исходный код с последней соединительной линии.
Отредактировано: спасибо Wrikken за то, что указали, как Laravel обрабатывает ошибки.
С GeoIP < = 1.0.8 geoip_country_code_by_name
вызовет ошибку (E_NOTICE) всякий раз, когда имя не может быть найдено. Laravel всегда будет устанавливать error_reporting на -1 и обрабатывать все ошибки (даже уведомления) и переводить их в ErrorExceptions. Обычно можно использовать ErrorExceptions, используя блок try-catch, но в этом случае это невозможно, потому что Laravel никогда не выдает исключение, он просто переводит его для отображения и ведения журнала.
Можно проигнорировать ошибку с помощью @-operator. Это немного плохо, потому что он будет игнорировать все ошибки, которые может вызвать функция. В этом случае, однако, единственная другая ошибка geoip_country_code_by_name
может вызывать предупреждение, когда база данных не может быть достигнута. Поэтому вы можете смело игнорировать эту ошибку, если вы убедитесь, что база данных доступна: (код не тестировался)
if (geoip_db_avail(GEOIP_COUNTRY_EDITION))
{
@geoip_country_code_by_name('unknown');
}
else
{
// Throw exception or handle the error
throw new Exception(
"Required database not available at " .
geoip_db_filename(GEOIP_COUNTRY_EDITION)
);
}
Edit: Laravel Теперь бросает ErrorException так, что один может поймать его с помощью блок try-catch. На момент написания этого изменения это еще не все выпущенные теги. Но ловушки будут возможно работать с Laravel/Framework> = 4.0.8.
Вы уверены? У меня нет возможности проверить это ... – hek2mgl
Уверен, о чем? Что ствол у него исправлен? Я не пробовал, но [это] (http://svn.php.net/viewvc/pecl/geoip/trunk/geoip.c?r1=318845&r2=318844&pathrev=318845) делает это довольно ясным. –
Да, это дает понять :) Хорошее исследование! – hek2mgl
В 1.1.0 модуля версии ошибка исправлена https://pecl.php.net/package-changelog.php?package=geoip&release=1.1.0
Есть ли у GeoIP * установлен *? http://www.php.net/manual/en/geoip.setup.php ErrorExceptions приходят с сообщениями об ошибках, указывающими, что это за ошибка. – ceejayoz
yep, geoip установлен. Сообщение об ошибке: «geoip_country_code_by_name(): Host unknown not found», но в документации (http://php.net/manual/en/function.geoip-country-code-by-name.php) эта функция должна возвращать значение false для эта ситуация. –
Вы пробовали настоящее имя хоста? Может быть, он знает, что «неизвестный» не является законным. – ceejayoz