【发布时间】: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,但这并不是我想要的。
感谢您的宝贵时间。
【问题讨论】:
标签: php facebook facebook-graph-api facebook-php-sdk