Facebook PHP SDK 抛出无法捕获的 OAuthException


Facebook PHP SDK Throwing an Uncatchable OAuthException

我正在尝试将打开的图形操作发布到Facebook Graph API,但收到OAuth异常(#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 Definition (base_facebook.php line 30(

抛出 OAuthException (base_facebook.php 行 1105

编辑 5/1/12

经过更多的调查,事实证明,这个"例外"根本没有真正被视为例外。 典型异常打印出堆栈跟踪,返回到导致引发异常的方法调用。 这些"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定义的类型提示是一个错误,这很可能是错误的一部分。

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

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

解决方案 1:

导入异常类:

<?php
use 'Exception;
// ...codes
try {
    //...codes
}
catch (Exception $e)
{
    //...codes
}

解决方案 2:

提供异常类的完整路径:

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