3

为什么这个代码:

geoip_country_code_by_name('unknown'); 

产生ErrorException,什么时候必须返回false?

4

2 回答 2

4

这是 GeoIP 包中的一个错误,在任何版本 (<= 1.0.8) 中都没有修复。但是,它固定在后备箱中(请参阅此修订版)。您可以通过从最新的主干编译源来解决这个问题。

已编辑:感谢Wrikken指出 Laravel 如何处理错误。

GeoIP <= 1.0.8将在找不到名称时geoip_country_code_by_name触发错误(E_NOTICE )。Laravel 将始终将error_reporting设置为-1并处理所有错误(甚至是通知)并将它们转换为ErrorExceptions。通常可以使用 try-catch 块捕获 ErrorExceptions,但在这种情况下这是不可能的,因为 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) 
    );

}

编辑: Laravel 现在抛出 ErrorException 以便可以使用 try-catch 块捕获它。在撰写本文时,此更改尚未出现在任何已发布的标签中。但是在Laravel/Framework >= 4.0.8 中可能会出现捕获错误。

于 2013-09-27T16:55:18.750 回答
1

在 1.1.0 模块版本中修复了错误https://pecl.php.net/package-changelog.php?package=geoip&release=1.1.0

于 2015-04-23T11:22:08.603 回答