为啥geoip会抛出异常?

Posted

技术标签:

【中文标题】为啥geoip会抛出异常?【英文标题】:Why does geoip throw an exception?为什么geoip会抛出异常? 【发布时间】:2013-09-27 15:50:18 【问题描述】:

为什么是这个代码:

geoip_country_code_by_name('unknown'); 

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

【问题讨论】:

您是否安装了GeoIPphp.net/manual/en/geoip.setup.php ErrorExceptions 附带错误消息,顺便指出错误是什么。 是的,geoip 已安装。错误消息:“geoip_country_code_by_name(): Host unknown not found”,但在文档中 (php.net/manual/en/function.geoip-country-code-by-name.php),此函数在这种情况下应该返回 false。 你试过真实的主机名吗?也许它知道unknown 不是合法的。 @Fnatte:Laraval 中肯。它定义了抛出ErrorException的错误处理程序。 PHP 生成一个通知(没有找到主机名的 ip),Laravel 生成一个ErrorException 【参考方案1】:

这是 GeoIP 包中的一个错误,在任何版本 (see this revision)。您可以通过从最新的主干编译源来解决此问题。

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

使用 GeoIP 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。

【讨论】:

确定什么?后备箱修好了没?我没试过,但this 说得很清楚。 如果你在关于 Laravel 从通知中创建例外的部分进行编辑,它就完成了,我将删除我的答案:) (我一回来,我就要出去了.. .) @Wrikken 添加了 Laravel 部分。有什么遗漏吗?:) @Fnatte:,好吧,try... catch..-ing 确实工作,否则,完美:) Erm,(1) Laravel 确实 抛出 ErrorException (2) 一个 可以 抓住它。只有如果没有捕获它,默认的异常处理程序会被调用,这只是一个通用的“有问题”消息debug' 设置为false in app/config/app.php, or a complete exception + trace is it is set to true. So what works for this problem are several options: (1) suppress the error with @` (2) 使用error_reporting() 来(暂时?)忽略E_NOTICE 错误。 (3) 重新填写mod_geoip,使其不会触发通知。 (4) 在代码周围使用try ... catch ... 块。【参考方案2】:

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

【讨论】:

以上是关于为啥geoip会抛出异常?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当参数为null时,postgres会抛出异常?

为啥 Android Geocoder 会抛出“服务不可用”异常?

为啥即使使用了调用,组合框也会抛出异常

为啥 HttpWebRequest 会抛出异常而不是返回 HttpStatusCode.NotFound?

为啥 Image.Save(Stream, ImageFormat) 会抛出异常?

为啥这个 Linq 方法会抛出空引用异常