Facebook PHP SDK引发无法捕获的“GraphMethodException”错误

时间:2013-09-01 03:26:54

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

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

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

Fatal error: Uncaught GraphMethodException: Unsupported get request. thrown in /path/to/apps/lib/facebook/src/base_facebook.php on line 1271

因此,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
}

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

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,但这并不是我想要的。

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

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

在您的情况下,您似乎尝试GET与我相同的事情,这需要获得许可:read_stream

有意义的是,他们会让这种东西无法捕捉 - 但你会认​​为facebook开发者可以做一些更友好的事情......

答案 1 :(得分:0)

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

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

我也看到了这个错误,这显然是由于我的应用程序没有相应的权限,正如@ rm-vanda所述。由于app id没有权限,因此不会返回令牌,这会导致您看到的错误。

希望有所帮助!