我遇到类似于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,但这并不是我想要的。
感谢您的时间。
答案 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没有权限,因此不会返回令牌,这会导致您看到的错误。
希望有所帮助!