php - Facebook PHP SDK 抛出无法捕获的 OAuthException

标签 php facebook facebook-graph-api facebook-php-sdk

我正在尝试向 Facebook Graph API 发布开放图谱操作,但收到 OAuth 异常 (#3501) User is already associated to the <object> .这一切都很好,我希望 Facebook 抛出这个异常(exception)。我得到了一些关于用户身份验证的其他异常(可能是旧的/陈旧的 session ,无论如何)。

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

<?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 Definition (base_facebook.php line 30)

Throwing OAuthException (base_facebook.php line 1105

编辑 5/1/12

经过更多的调查,事实证明这个“异常”根本没有被当作异常对待。 Typical Exceptions 打印出堆栈跟踪,返回到导致抛出异常的方法调用。这些“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

在这种特殊情况下,我们没有得到任何信息,它看起来更像是典型的 fatal error :

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

我无法理解为什么这个被遗弃的“异常(exception)”如此奇怪/无法捕捉。

解决方案:

我找到了我自己问题的答案;我在下面添加了它 - 这是开发人员错误,而不是错误。答案如下。

此外,如果您想说能够将类定义作为对 catch 的类型提示的引用,这很可能是一个错误的部分。不存在(或在当前命名空间中不可用)的定义是一个错误。

最佳答案

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

如果您在已定义的命名空间(即,不是根 (\) 命名空间)中,您将无法直接访问 Exception 类。 php 不会发出不知道该类是什么的警告,而是忽略它不知道它是什么的事实 - 并且不会捕获异常。

解决方案一:

导入异常类:

<?php
use \Exception;

// ...codes

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

解决方案 2:

提供异常类的完整路径:

<?php
try {
    //.....
}
catch (\Exception $e)
{
    // voila.
}

关于php - Facebook PHP SDK 抛出无法捕获的 OAuthException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10402939/

相关文章:

php - 当 PHP 类动态调整图像大小时,Zurb Foundation 中的 Interchange.js 出现问题

facebook - 开放图谱测试版 : How can you tag friends in a action?

php - 为什么我的集合结构不符合预期(不是我需要的)

javascript - 删除数据库中的上一行 单击按钮显示数据库中的下一行

Facebook 在处理 oauth 请求时生成 "An error occurred. Please try later"

php - 实时显示在其他在线用户上?

facebook - 如何检查给定的用户 ID 是否已验证我的应用程序?

facebook - Facebook Graph API 中帖子到达的 API 参数是什么

php - 对齐 xml 文档

ios - 最新的 Facebook SDK 是否会自动检查其应用程序是否已安装?它说它会......但它不会发生在我身上