我正在尝试向Facebook Graph API发布开放图表操作,但收到OAuth异常(#3501) User is already associated to the <object>
。这一切都很好,我希望Facebook抛出这个例外。我得到了一些关于验证用户身份的其他例外情况(可能是旧的/陈旧的会话,无论如何)。
我的问题是,有没有其他人经历过这个异常在php中无法访问?在这个特定的例子中(发布图形动作)我绝对在try / catch语句中包装对api的调用;但我仍然得到了致命的错误。
<?php
try {
//publishing to open graph
$this->fb->api('/me/app:action', 'POST', array(
'object' => 'http://www.domain.com/path/to/graph/object',
));
}
catch (Exception $e)
{
/*
We may get here if the user has already posted this action before...
or if our session somehow went sour
or bc facebook is down...
or one of any other 1000 reasons the graph api is currently
sucking...
in any case it doesn't much matter, this is not a mission critical
thing to worry about; if we don't post the graph action - we don't
post the graph action..nbd.
*/
}
上面的代码是发布图形动作的片段(概括,因为它的内容对于这个例子并不重要)。
我意识到Facebook PHP SDK抛出的异常是FacebookApiException
,但该类扩展了Exception。我不能为我的生活弄清楚为什么在所有事物的名义逻辑上,我不能像这样抓住我的例外。
有没有人遇到过这个问题?这是FB PHP SDK中的错误吗?我在这里错过了什么吗?谢谢你的帮助!
另外,作为参考,FB PHP SDK的相关部分在这里:
FacebookAPIException Definition (base_facebook.php line 30)
Throwing OAuthException (base_facebook.php line 1105
经过一番调查后,事实证明这个“异常”并没有真正被视为例外。典型的异常将堆栈跟踪打印回方法调用,导致抛出异常。这些“OAuthExceptions”没有。此外,典型的例外情况有点不同,例如:
PHP Fatal error: Uncaught exception 'Exception' with message 'foo' /path/to/file.php:10
或
PHP Fatal error: Uncaught exception 'MyException' with message 'stupid php' /path/to/file:10
#0 /path/to/file.php(17): doTest()
#1 {main}
thrown in /path/to/file.php on line 10
在这种特殊情况下,我们没有得到任何这些,它看起来更像是一个典型的致命错误:
PHP Fatal error: Uncaught OAuthException: (#3501) User is already associated \
to the <object> object on a unique action type <action>. Original Action ID: \
123123123
thrown in /path/to/app/libs/fb/base_facebook.php on line 1107, \
referer: http://www.domain.com/path/to/page
我无法理解为什么这个被抛弃的“异常”如此奇怪/无法捕捉。
我找到了自己问题的答案;我在下面添加了它 - 它是开发人员错误,而不是错误。答案如下。
此外,如果您想说能够将类定义作为catch
定义的类型提示引用,那么这很可能是错误的部分不存在(或在当前命名空间中不可用)是一个错误。
答案 0 :(得分:7)
所以,上面没有概述的是我正在使用PHP名称空间。这是一个很大的问题,因为命名空间对于php来说相对较新,我觉得这很容易被忽视。无论如何,这是一个非常愚蠢的疏忽/错误。
如果您位于已定义的命名空间(即不是根(\)命名空间),则您无法直接访问Exception
类。而不是php抛出关于不知道该类是什么的警告,它只是忽略了它不知道它是什么的事实 - 并且没有捕获异常。
解决方案1:
导入异常类:
<?php
use \Exception;
// ...codes
try {
//...codes
}
catch (Exception $e)
{
//...codes
}
解决方案2:
提供异常类的完整路径:
<?php
try {
//.....
}
catch (\Exception $e)
{
// voila.
}