Facebook PHP SDK 抛出无法捕获的“GraphMethodException”错误

Posted

技术标签:

【中文标题】Facebook PHP SDK 抛出无法捕获的“GraphMethodException”错误【英文标题】:Facebook PHP SDK throws uncatchable "GraphMethodException" error 【发布时间】:2013-09-01 03:26:53 【问题描述】:

我遇到的事情与this question about an uncatchable php error thrown by the Facebook PHP SDK 非常相似,只是我根本没有使用 PHP 命名空间。 This other question 也很接近,但没有解释为什么错误无法捕获。此外,就我而言,我有一个 Facebook 应用程序,它针对当前用户已阻止的对象发出 Facebook Graph API 调用。这当然很尴尬,但对于这个特定的应用程序来说是合法的。这意味着我需要捕获错误,而不是阻止用户首先进行搜索。

我的开发环境中的致命错误输出如下所示:

致命错误:未捕获的 GraphMethodException:不支持的获取请求。在第 1271 行的 /path/to/apps/lib/facebook/src/base_facebook.php 中抛出

因此,Facebook 的 Graph API 作为 API 调用的结果正确地返回了一个错误,引用了“不支持的获取请求”。但是,Facebook PHP SDK 似乎将此作为无法捕获的错误抛出, 我不知道为什么。

我尝试了类似以下catch 块的代码,但没有成功:

try 
    $response = $facebook->api("/$some_id_of_object_current_user_has_blocked");
 catch (FacebookApiException $e) 
    // Why does this never get caught?
 catch (Exception $e) 
    // Similarly, this also never gets caught!
 catch (GraphMethodException $e) 
    // Still can't catch this exception, and I don't grok why. :(

为了荒谬的完整性,我还尝试了命名空间,包括以下内容:

try 
    $response = $facebook->api("/$some_id_of_object_current_user_has_blocked");
 catch (\FacebookApiException $e) 
 catch (\Exception $e) 
 catch (\FacebookApiException\GraphMethodException $e) 
 catch (\GraphMethodException $e) 
 catch (... $e) 

进一步的调查使我尝试在base_facebook.php 文件本身中捕获它,它似乎被抛出,在the protected Facebook::_graph method 中。果然,它在那里可以捕捉到的。 base_facebook.php 的第 879 行左右的原始代码是:

if (is_array($result) && isset($result['error'])) 
  $this->throwAPIException($result);
  // @codeCoverageIgnoreStart

使用try...catch 块将此​​调用包装到throwAPIException() 有效:

if (is_array($result) && isset($result['error'])) 
  try 
    $this->throwAPIException($result);
    // @codeCoverageIgnoreStart
   catch (Exception $e) 
    // WORKS!
  

如果它在那里工作,为什么我不能从我自己的脚本中捕获这个异常?我是否遗漏了有关 PHP 错误处理工作方式的一些基本知识?

另外,Facebook 应用程序是否有办法获取 Facebook 用户已阻止的所有对象的列表,例如用户已阻止的其他 Facebook 用户?我对 Graph API 非常熟悉,知道有一种方法可以让应用访问a list of all users a page has blocked,但这并不是我想要的。

感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

这显然是无法捕获的,因为它与您的应用使用的权限有关。

在您的情况下,您似乎正在尝试 GET 和我一样的事情,这需要许可:read_stream

他们会让这种事情变得不可捉摸是有道理的——但你会认为 facebook 开发人员可以做一些更友好的事情......

【讨论】:

我不明白在这种情况下使异常无法捕获有什么意义。没有给出所需的权限是一件非常“正常”的事情,能够捕捉到它将使您能够真正对它做出反应并请求丢失的权限。 @Meitar,我建议你向 Facebook 提交一份错误报告。 不,这根本不涉及安全性。 您在请求您无权访问的内容时遇到异常这一事实在此处足够“安全”——因为您没有获取数据。但是您应该能够抓住这一点,以便您的应用能够做出反应,而不会简单地“死掉”。【参考方案2】:

在 $this->throwAPIException($result); 周围添加 try/catch可以抑制错误消息,但我建议检查函数的输入以确保它们存在且有效。

例如,在将其传递给任何函数之前,检查 $SESSION['fb_access_token'] 是否存在且不为空。如果未设置或为空,则依赖它的任何功能都不会起作用,您可以在与 Facebook 的服务器通信之前发现潜在问题,这会通过跳过您可以提前确定会失败的功能来加速您的应用程序,并通过主动而不是被动地要求更正来更快地解决问题。

我也看到了这个错误,这显然是由于我的应用程序没有适当的权限引起的,正如@rm-vanda 所说。由于应用 ID 没有权限,因此不会返回令牌,从而导致您看到的错误。

希望有帮助!

【讨论】:

以上是关于Facebook PHP SDK 抛出无法捕获的“GraphMethodException”错误的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的 OAuthException Facebook PHP SDK

无法从 Swift 中的 Facebook iOS SDK 捕获城市和国家/地区值

Facebook PHP SDK 报错

Facebook-connect:无法使用PHP SDK + JS SDK注销

无法在 Laravel 4 中使用 Facebook 的 PHP SDK 获取用户个人资料

PHP 异常处理 总出现致命错误 无法捕获异常