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.