为啥geoip会抛出异常?
Posted
技术标签:
【中文标题】为啥geoip会抛出异常?【英文标题】:Why does geoip throw an exception?为什么geoip会抛出异常? 【发布时间】:2013-09-27 15:50:18 【问题描述】:为什么是这个代码:
geoip_country_code_by_name('unknown');
产生ErrorException,什么时候必须返回false?
【问题讨论】:
您是否安装了GeoIP? php.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会抛出异常?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Android Geocoder 会抛出“服务不可用”异常?
为啥 HttpWebRequest 会抛出异常而不是返回 HttpStatusCode.NotFound?