Почему geoip создает исключение?
Почему этот код:
geoip_country_code_by_name('unknown');
Генерировать исключение ErrorException, когда должно быть возвращено значение false?
2 answers
Это ошибка в пакете GeoIP и не исправлена ни в одном выпуске ( см. Эту редакцию ). Вы можете решить эту проблему, скомпилировав исходный код из последней магистрали.
Отредактировано: спасибо Wrikken за указание на то, как Laravel обрабатывает ошибки.
С GeoIP geoip_country_code_by_name вызовет ошибку (E_NOTICE) всякий раз, когда имя не может быть найдено. Laravel всегда будет устанавливать сообщение об ошибке в -1 и обрабатывать все ошибки (даже уведомления) и переводить их в Исключения ошибок . Обычно можно перехватывать исключения ошибок с помощью блока try-catch, но в данном случае это невозможно, потому что Laravel никогда не создает исключение, он просто переводит его для отображения и ведения журнала.
Ошибку можно игнорировать с помощью @-оператора. Это немного плохо, так как это будет игнорировать все ошибки, которые может вызвать функция. В этом случае, однако, только другая ошибка 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)
);
}
Редактировать: Теперь Laravel выдает исключение ErrorException, чтобы его можно было поймать с помощью блока try-catch. На момент написания этой статьи это изменение еще не было внесено ни в один выпущенный тег. Но ошибки перехвата , вероятно, будут работать с Laravel/Framework>=4.0.8.
В версии модуля 1.1.0 исправлена ошибка https://pecl.php.net/package-changelog.php?package=geoip&release=1.1.0