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::_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 に精通しているので、ページがブロックしたすべてのユーザーのリストにアプリがアクセスする方法があることを知っていますが、それは特に私が探しているものではありません。
御時間ありがとうございます。