3

除了我根本没有使用 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::_graphbase_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 非常熟悉,知道有一种方法可以让应用程序访问页面已阻止的所有用户的列表,但这并不是我想要的。

谢谢你的时间。

4

2 回答 2

0

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

就您而言,看起来您正在尝试与GET我相同的事情,这需要许可:read_stream

他们会让这种事情变得不可捉摸是有道理的——但你会认为 facebook 开发人员可以做一些更友好的事情......

于 2013-10-09T16:48:53.230 回答
0

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

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

正如@rm-vanda 所说,我还看到了这个错误,这显然是由于我的应用程序没有适当的权限引起的。由于应用程序 ID 没有权限,因此不会返回令牌,这会导致您看到的错误。

希望有帮助!

于 2013-11-22T21:52:11.243 回答