2013-09-27 4 views
3

Почему этот код:Почему geoip выбрасывает исключение?

geoip_country_code_by_name('unknown'); 

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

+1

Есть ли у GeoIP * установлен *? http://www.php.net/manual/en/geoip.setup.php ErrorExceptions приходят с сообщениями об ошибках, указывающими, что это за ошибка. – ceejayoz

+0

yep, geoip установлен. Сообщение об ошибке: «geoip_country_code_by_name(): Host unknown not found», но в документации (http://php.net/manual/en/function.geoip-country-code-by-name.php) эта функция должна возвращать значение false для эта ситуация. –

+0

Вы пробовали настоящее имя хоста? Может быть, он знает, что «неизвестный» не является законным. – ceejayoz

ответ

3

Это ошибка в пакете 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.

+0

Вы уверены? У меня нет возможности проверить это ... – hek2mgl

+1

Уверен, о чем? Что ствол у него исправлен? Я не пробовал, но [это] (http://svn.php.net/viewvc/pecl/geoip/trunk/geoip.c?r1=318845&r2=318844&pathrev=318845) делает это довольно ясным. –

+0

Да, это дает понять :) Хорошее исследование! – hek2mgl

Смежные вопросы