Facebook PHP SDK Бросает непонятное исключение OAuthException

Я пытаюсь опубликовать действие открытого графа API-интерфейса Facebook, но получение исключения 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. */ } 

Вышеприведенный код – это фрагмент, который публикует действие графа (обобщенное, потому что его содержание не важно для этого примера).

Я понимаю, что исключение, которое генерирует PHP SDK для FacebookApiException это исключение FacebookApiException но этот класс расширяет исключение. Я не могу для жизни понять, почему во имя всего логично, я не могу поймать свое исключение, как это.

Кто-нибудь испытал эту проблему? Это ошибка в FB PHP SDK? Я пропустил что-то еще здесь? Спасибо за вашу помощь!

Кроме того, для справки, соответствующие части FB PHP SDK находятся здесь:

Определение FacebookAPIException (строка base_facebook.php 30)

Выброс OAuthException (base_facebook.php line 1105

Редактировать 5/1/12

После еще нескольких исследований выясняется, что это «Исключение» на самом деле не рассматривается как исключение вообще. Типичные исключения распечатывают трассировку стека назад к вызову метода, в результате которого возникает исключение. Эти «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 которого не было (или не было доступно в текущем пространстве имен) это ошибка.

Solutions Collecting From Web of "Facebook PHP SDK Бросает непонятное исключение OAuthException"

Итак, что-то, что не указано выше, заключается в том, что я использую пространства имен PHP. Это большой gotchta, поскольку пространства имен относительно новы для php, это очень легко упускать из виду, что я чувствую. Несмотря на это, это довольно глупый промах / ошибка.

Если вы находитесь в определенном пространстве имен (то есть не в пространстве имен root (\)), вы не имеете прямого доступа к классу Exception . Вместо того, чтобы php бросает предупреждение о том, что не знает, что это за класс, он просто игнорирует тот факт, что он не знает, что это такое – и не вызывает исключения.

Решение 1:

импортировать класс исключения:

 <?php use \Exception; // ...codes try { //...codes } catch (Exception $e) { //...codes } 

Решение 2:

предоставить полный путь к классу исключений:

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