3

PHP名前空間をまったく使用していないという事実を除いて、Facebook PHP SDKによってスローされたキャッチできないPHPエラーに関するこの質問と不気味に似た何かが発生しています。この他の質問も近いですが、エラーがキャッチできない理由を説明していません。さらに、私の場合、現在のユーザーがブロックしたオブジェクトに対して Facebook Graph API 呼び出しを発行する Facebook アプリがあります。これは確かに厄介ですが、この特定のアプリの目的上は合法です。つまり、そもそもユーザーが検索を行うのを妨げるのではなく、エラーをキャッチする必要があるということです。

私の開発環境での致命的なエラーの出力は次のようになります。

致命的なエラー: キャッチされていない GraphMethodException: サポートされていない取得要求です。/path/to/apps/lib/facebook/src/base_facebook.php の 1271 行目にスローされます

そのため、Facebook の Graph API は、API 呼び出しの結果として、「サポートされていない get 要求」を引用してエラーを正しく返します。ただし、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'] が存在し、null でないかどうかを確認します。これが設定されていないか null の場合、それに依存する関数はどれも機能せず、Facebook のサーバーと通信する前に潜在的な問題を見つけることができます。これにより、失敗すると事前に判断できる関数をスキップすることでアプリケーションが高速化されます。再アクティブではなく積極的に修正を依頼することで、問題をより迅速に解決できます。

@rm-vandaが述べたように、アプリに適切な権限がないことが原因であると思われるこのエラーも表示されていました。アプリ ID にはアクセス許可がないため、トークンが返されず、表示されているエラーが発生します。

それが役立つことを願っています!

于 2013-11-22T21:52:11.243 に答える