ejemplos - Facebook PHP SDK Lanzando una OAuthException Uncatchable
facebook/php-sdk-v4 (1)
Entonces, algo que no está en el esquema anterior es que estoy utilizando espacios de nombres PHP. Esta es una gran gotchta ya que los espacios de nombres son relativamente nuevos en php, es muy fácil de pasar por alto lo que siento. En cualquier caso, es una tontería / error bastante tonto.
Si se encuentra en un espacio de nombres definido (es decir, no en el espacio de nombres raíz (/)), no tiene acceso directo a la clase Exception
. En lugar de php lanzar una advertencia sobre no saber qué clase es, simplemente ignora el hecho de que no sabe qué es, y no capta la excepción.
Solución 1:
importar la clase de excepción:
<?php
use /Exception;
// ...codes
try {
//...codes
}
catch (Exception $e)
{
//...codes
}
Solución 2:
proporcione la ruta completa a la clase de excepción:
<?php
try {
//.....
}
catch (/Exception $e)
{
// voila.
}
Estoy intentando publicar una acción de gráfico abierto en la API Graph de Facebook pero recibir una excepción de OAuth (#3501) User is already associated to the <object>
. Eso está muy bien, espero que Facebook arroje esa excepción. Tengo algunas otras excepciones con respecto a la autenticación de un usuario (tal vez con sesiones viejas / obsoletas, lo que sea).
Mi pregunta es, ¿alguien más ha experimentado que esta excepción es imposible de encontrar en php? En este ejemplo específico (de publicación de acciones de gráficos), estoy completando la llamada a la API en una declaración try / catch; pero sigo teniendo el error fatal.
<?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.
*/
}
El código anterior es el fragmento donde se publica la acción del gráfico (generalizada, porque el contenido del mismo no es importante para este ejemplo).
Me doy cuenta de que la excepción que está lanzando el Facebook PHP SDK es una FacebookApiException
pero esa clase amplía Exception. No puedo entender por qué en nombre de todas las cosas lógicas, no puedo ver mi excepción así.
¿Alguien ha experimentado este problema? ¿Es esto un error en el FB PHP SDK? ¿Me estoy perdiendo algo más aquí? ¡Gracias por tu ayuda!
Además, como referencia, las partes relevantes del FB PHP SDK están aquí:
Definición de FacebookAPIException (base_facebook.php línea 30)
Lanzamiento de OAuthException (base_facebook.php línea 1105
Editar 5/1/12
Después de investigar un poco más, resulta que esta "Excepción" en realidad no se está tratando como una excepción. Las Excepciones típicas imprimen un seguimiento de la pila de regreso a la llamada al método que dio como resultado arrojar la excepción. Estas "OAuthExceptions" no. Además, las excepciones típicas muestran su cadena de error de forma un poco diferente, por ejemplo:
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
En este caso particular, no obtenemos nada de eso, y se parece mucho más a un error fatal típico:
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
No puedo entender por qué esta "Excepción" abandonada es tan extraña / imposible de atrapar.
La solución:
Descubrí la respuesta a mi propia pregunta; Lo he agregado a continuación: es un error del desarrollador, no un error. La respuesta esta abajo
Además, esto muy bien podría ser parte de un error, si quisiera decir que puede hacer referencia a una definición de clase como una sugerencia de tipo a la definición de catch
que no existía (o que no estaba disponible en el espacio de nombres actual) es un error.