6

我正在尝试向 Facebook Graph API 发布开放图形操作,但收到 OAuth Exception (#3501) User is already associated to the <object>。这一切都很好,我希望 Facebook 会抛出这个异常。我在验证用户时遇到了一些其他例外情况(可能是旧的/陈旧的会话,无论如何)。

我的问题是,有没有其他人经历过这个异常在 php 中是无法捕获的?在这个特定示例(发布图形操作)中,我绝对将对 api 的调用包装在 try/catch 语句中;但我仍然收到致命错误。

<?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但该类扩展了异常。我一生都无法弄清楚为什么以所有合乎逻辑的事物的名义,我无法像这样抓住我的例外。

有没有人遇到过这个问题?这是 FB PHP SDK 中的错误吗?我在这里错过了其他东西吗?谢谢你的帮助!

另外,作为参考,FB PHP SDK的相关部分在这里:

FacebookAPIException 定义(base_facebook.php 第 30 行)

抛出 OAuthException(base_facebook.php 第 1105 行

2012 年 5 月 1 日编辑

经过一番调查,事实证明这个“异常”并没有真正被视为一个异常。典型异常打印出返回到导致抛出异常的方法调用的堆栈跟踪。这些“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不存在(或在当前命名空间中不可用)的定义的类型提示是一个错误。

4

1 回答 1

7

所以,上面没有提到的是我正在使用 PHP 命名空间。这是一个很大的问题,因为命名空间对 php 来说相对较新,我觉得它很容易被忽视。无论如何,这是一个非常愚蠢的疏忽/错误。

如果您位于已定义的命名空间(即,不是根 (\) 命名空间)中,则您无法直接访问Exception该类。而不是 php 抛出关于不知道该类是什么的警告,它只是忽略了它不知道它是什么的事实 - 并且没有捕获异常。

解决方案1:

导入异常类:

<?php
use \Exception;

// ...codes

try {
    //...codes
}
catch (Exception $e)
{
    //...codes
}

解决方案2:

提供异常类的完整路径:

<?php
try {
    //.....
}
catch (\Exception $e)
{
    // voila.
}
于 2012-05-01T20:03:03.407 回答