2013-09-27 107 views
3

为什么验证码:为什么geoip抛出异常?

geoip_country_code_by_name('unknown'); 

产生ErrorException,当必须返回假的?

+1

您是否安装了GeoIP * *? http://www.php.net/manual/en/geoip.setup.php顺便提一下,ErrorExceptions带有错误消息,指出错误是什么。 – ceejayoz

+0

是的,geoip已安装。错误消息:“geoip_country_code_by_name():Host unknown not found”,但在文档中(http://php.net/manual/en/function.geoip-country-code-by-name.php),此函数应返回false for这个情况。 –

+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。通常可以使用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 /框架> = 4.0.8。

+0

你确定吗?我没有机会去测试它...... – hek2mgl

+1

当然有什么?那干线有固定的?我没有尝试,但[这](http://svn.php.net/viewvc/pecl/geoip/trunk/geoip.c?r1=318845&r2=318844&pathrev=318845)使它很清楚。 –

+0

是的,这很清楚:)好的研究! – hek2mgl

相关问题