除了我根本没有使用 PHP 命名空间这一事实之外,我遇到的问题与 Facebook PHP SDK 引发的无法捕获的 PHP 错误非常相似。这个另一个问题也很接近,但没有解释为什么错误是无法捕获的。此外,就我而言,我有一个 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
中在文件本身中捕获它,它似乎被抛出。果然,它在那里是可以捕捉到的。大约第 879 行的原始代码是:Facebook::_graph
base_facebook.php
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 非常熟悉,知道有一种方法可以让应用程序访问页面已阻止的所有用户的列表,但这并不是我想要的。
谢谢你的时间。