6 Stimmen

Facebook PHP SDK wirft eine unfangbare OAuthException

Ich versuche, eine Open-Graph-Aktion an die Facebook Graph-API zu senden, erhalte aber eine OAuth-Exception (#3501) User is already associated to the <object> . Das ist alles schön und gut, ich erwarte, dass Facebook diese Ausnahme auslöst. Ich erhalte einige andere Ausnahmen bezüglich der Authentifizierung eines Benutzers (vielleicht mit alten/veralteten Sitzungen, was auch immer).

Meine Frage ist, hat jemand anderes erlebt, dass diese Ausnahme in PHP unfangbar ist? In diesem speziellen Beispiel (der Buchung von Diagramm-Aktionen) bin ich absolut Verpackung den Aufruf der API in einem Try/Catch-Anweisung; aber ich bekomme immer noch den fatalen Fehler.

<?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.
    */
}

Der obige Code ist das Snippet, das die Graph-Aktion veröffentlicht (verallgemeinert, da der Inhalt für dieses Beispiel nicht wichtig ist).

Mir ist klar, dass die Exception, die das Facebook PHP SDK auslöst, eine FacebookApiException aber diese Klasse erweitert Exception. Ich kann nicht für das Leben von mir herausfinden, warum im Namen aller Dinge logisch, ich kann nicht meine Ausnahme wie diese fangen.

Hat jemand Erfahrung mit diesem Problem? Ist dies ein Fehler in der FB-PHP-SDK? Übersehe ich hier etwas anderes? Vielen Dank für Ihre Hilfe!

Außerdem finden Sie hier die relevanten Teile des FB PHP SDK:

FacebookAPIException Definition (base_facebook.php Zeile 30)

OAuthException wird geworfen (base_facebook.php Zeile 1105

Bearbeiten 5/1/12

Nach weiteren Untersuchungen stellt sich heraus, dass diese "Exception" nicht wirklich wie eine Ausnahme behandelt wird. Typische Exceptions geben einen Stacktrace zurück zu dem Methodenaufruf aus, der zum Auslösen der Exception geführt hat. Diese "OAuthExceptions" tun dies nicht. Außerdem geben typische Ausnahmen ihre Fehlerzeichenfolge etwas anders aus, zum Beispiel:

PHP Fatal error:  Uncaught exception 'Exception' with message 'foo' /path/to/file.php:10

o

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

In diesem speziellen Fall erhalten wir nichts davon, und es sieht eher wie ein typischer fataler Fehler aus:

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

Ich kann mir nicht erklären, warum diese verfluchte "Ausnahme" so seltsam/uneinholbar ist.

Die Lösung:

Ich habe die Antwort auf meine eigene Frage herausgefunden; ich habe sie unten hinzugefügt - es handelt sich um einen Entwicklerfehler, nicht um einen Bug. Die Antwort steht unten.

Außerdem könnte dies sehr wohl sein Teil eines Fehlers, wenn Sie sagen wollen, dass die Möglichkeit, eine Klassendefinition als Typ-Hinweis für die catch Definition, die nicht existiert (oder im aktuellen Namespace nicht verfügbar ist), ist ein Fehler.

7voto

Jim Rubenstein Punkte 6797

Also, etwas, das nicht oben skizziert wird, ist, dass ich PHP-Namespaces verwende. Dies ist eine große gotchta seit Namespaces sind relativ neu in PHP, es ist super leicht übersehen, ich fühle. Unabhängig davon, es ist ein ziemlich dummes Versehen/Fehler.

Wenn Sie sich in einem definierten Namespace befinden (d.h. nicht im Root-Namespace (\)), haben Sie keinen direkten Zugriff auf die Exception Klasse. Anstatt dass php eine Warnung ausgibt, weil es nicht weiß, was diese Klasse ist, ignoriert es einfach die Tatsache, dass es nicht weiß, was es ist - und fängt die Ausnahme nicht ab.

Lösung 1:

die Ausnahmeklasse importieren:

<?php
use \Exception;

// ...codes

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

Lösung 2:

den vollständigen Pfad zur Ausnahmeklasse angeben:

<?php
try {
    //.....
}
catch (\Exception $e)
{
    // voila.
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X