6

オープングラフアクションを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.
    */
}

上記のコードは、グラフアクションを公開するスニペットです(この例では内容が重要ではないため、一般化されています)。

FacebookApiExceptionFacebook 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である可能性があります。バグ。

4

1 に答える 1

7

したがって、上記で概説されていないことは、私がPHP名前空間を利用しているということです。名前空間はphpにとって比較的新しいので、これは大きな落とし穴です。私が感じるのは非常に簡単に見落とされがちです。とにかく、それはかなりばかげた見落とし/エラーです。

Exception定義された名前空間(つまり、ルート(\)名前空間ではない)にいる場合、クラスに直接アクセスすることはできません。phpがそのクラスが何であるかを知らないという警告をスローする代わりに、それが何であるかを知らないという事実を無視し、例外をキャッチしません。

解決策1:

例外クラスをインポートします。

<?php
use \Exception;

// ...codes

try {
    //...codes
}
catch (Exception $e)
{
    //...codes
}

解決策2:解決策2:

例外クラスへのフルパスを指定します。

<?php
try {
    //.....
}
catch (\Exception $e)
{
    // voila.
}
于 2012-05-01T20:03:03.407 に答える