オープングラフアクションをFacebookGraphAPIに投稿しようとしていますが、OAuth例外を受け取ります(#3501) User is already associated to the <object>
。それはすべてうまくいっています、私はFacebookがその例外を投げることを期待しています。ユーザーの認証に関して他のいくつかの例外があります(おそらく古い/古いセッションで)。
私の質問は、この例外がphpでキャッチできないことを他の誰かが経験したことがありますか?この特定の例(グラフアクションの投稿)では、APIへの呼び出しをtry/catchステートメントで完全にラップしています。しかし、それでも致命的なエラーが発生します。
<?php
try {
//publishing to open graph
$this->fb->api('/me/app:action', 'POST', array(
'object' => 'http://www.domain.com/path/to/graph/object',
));
}
catch (Exception $e)
{
/*
We may get here if the user has already posted this action before...
or if our session somehow went sour
or bc facebook is down...
or one of any other 1000 reasons the graph api is currently
sucking...
in any case it doesn't much matter, this is not a mission critical
thing to worry about; if we don't post the graph action - we don't
post the graph action..nbd.
*/
}
上記のコードは、グラフアクションを公開するスニペットです(この例では内容が重要ではないため、一般化されています)。
FacebookApiException
Facebook PHP SDKがスローしている例外はですが、そのクラスはExceptionを拡張していることに気付きました。論理的なものすべての名の下に、なぜこのような例外を捕まえることができないのか、私は一生理解できません。
誰かがこの問題を経験しましたか?これはFBPHPSDKのバグですか?私はここで何か他のものが欠けていますか?ご協力いただきありがとうございます!
また、参考のために、FBPHPSDKの関連部分は次のとおりです。
FacebookAPIException定義(base_facebook.php行30)
OAuthExceptionをスローします(base_facebook.php行1105
2012年5月1日編集
さらに調査した結果、この「例外」は実際には例外のように扱われていないことがわかりました。一般的な例外は、例外をスローする結果となったメソッド呼び出しにスタックトレースを出力します。これらの「OAuthExceptions」はそうではありません。また、一般的な例外は、エラー文字列を少し異なる方法で表示します。たとえば、次のようになります。
PHP Fatal error: Uncaught exception 'Exception' with message 'foo' /path/to/file.php:10
また
PHP Fatal error: Uncaught exception 'MyException' with message 'stupid php' /path/to/file:10
#0 /path/to/file.php(17): doTest()
#1 {main}
thrown in /path/to/file.php on line 10
この特定のケースでは、それは何も得られず、典型的な致命的なエラーのように見えます。
PHP Fatal error: Uncaught OAuthException: (#3501) User is already associated \
to the <object> object on a unique action type <action>. Original Action ID: \
123123123
thrown in /path/to/app/libs/fb/base_facebook.php on line 1107, \
referer: http://www.domain.com/path/to/page
この見捨てられた「例外」がなぜそんなに奇妙で捕まえられないのか、私には理解できません。
ソリューション:
私は自分の質問に対する答えを見つけました。以下に追加しました。これは開発者のエラーであり、バグではありません。答えは以下の通りです。
また、存在しなかった(または現在の名前空間で利用できなかった)定義へのタイプヒントとしてクラス定義を参照できると言いたい場合、これはバグの一部catch
である可能性があります。バグ。