为什么geoip会抛出异常?

时间:2013-09-27 15:50:19

标签: php laravel geoip

为什么这段代码:

geoip_country_code_by_name('unknown'); 

生成ErrorException,何时必须返回false?

2 个答案:

答案 0 :(得分:4)

这是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 。通常可以使用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一起工作。

答案 1 :(得分:1)