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
我也看到了这个错误,这显然是由于我的应用程序没有适当的权限引起的,正如@rm-vanda 所说。由于应用 ID 没有权限,因此不会返回令牌,从而导致您看到的错误。
希望有帮助!
【讨论】:
以上是关于Facebook PHP SDK 抛出无法捕获的“GraphMethodException”错误的主要内容,如果未能解决你的问题,请参考以下文章
未捕获的 OAuthException Facebook PHP SDK
无法从 Swift 中的 Facebook iOS SDK 捕获城市和国家/地区值
Facebook-connect:无法使用PHP SDK + JS SDK注销