2013-08-07 4 views
0

Я хотел бы получить свое исключение api, но я не понимаю, как это сделать. Это мой кодthrow APIException Facebook api php

public function facebook($link){ 

    if(!$link || !trim($link) != ""){ 
     return false; 
    } 

    $config = array(
      'appId'=>$this->keys['facebook']['id'], 
      'secret'=>$this->keys['facebook']['secret'], 
      'fileUpload'=>false 
    ); 

    $facebook = new Facebook($config); 


    $start = strrpos($link, '/', -1); 
    $end = strripos($link, '?', -1); 
    $end = ($end)?$end:strlen($link); 

    $pageId = ($end == strlen($link))?substr($link, $start + 1):substr($link, $start + 1, $end - strlen($link)); 

    try { 
     $pagefeed = $facebook->api("/" . $pageId . "/feed"); 
    } 
    catch (FacebookApiException $e){ 
     return false; 
    } 

    //set datetime 
    foreach ($pagefeed['data'] as $key => $post){ 
     $pagefeed['data'][$key]['datetime'] = new \DateTime($post['created_time']); 
    } 

    return $pagefeed; 
} 

Так что я хотел бы вернуться ложным в случае исключения.

я получил за Exemple:

BaseFacebook ->throwAPIException (array('error' => array('message' => '(#803) Some of the aliases you requested do not exist: lkdsgfkqdjgflkdshbf', 'type' => 'OAuthException', 'code' => '803'))) 

Спасибо за вашу помощь

ответ

2

Поскольку вы отметили, что вы используете Symfony, и вы исправили тип-подсказку с помощью catch(\Exception $e) вы можете рассмотреть вопрос о добавив в верхней части вашего файла:

use \APIException; 

чтобы установить APIException в качестве псевдонима для \APIException. Also check this link. Не использовав API FB, я не знаю, насколько это актуально, но при условии, что facebook api хранится в вашем каталоге поставщика, вам нужно будет указать правильные пространства имен при использовании api.
Причина, по которой работает \Exception, - это просто потому, что, как показывает связанная страница, класс APIException простирается от базового класса \Exception, поэтому тип-подсказка работает. Это не имеет решающего значения, но лучше поймать правильное исключение в нужном месте.

Исключение выбрано, и вы поймаете его, используя блок catch. Пока это так хорошо, оно, однако, попадает в область метода, которая GC'ed, когда возвращается этот метод (Garbage Collected). Exception isntance больше не выходит.
Как правило, если вы хотите получить доступ к исключению вне метода (скорее всего, в коде, вызывающем метод), вы просто не поймаете исключение. Удалите try-catch из метода facebook и сделать это:

//call method: 
try 
{ 
    $return = $instance->facebook($someLink); 
} 
catch (APIException $e) 
{ 
    $return = false;//exception was thrown, so the return value should be false 
    var_dump($e);//you have access to the exception here, too 
} 

Ловля исключения и не делать ничего с ним (вы поймать, но возвращение ложным, нет способа узнать, почему ) не считается плохой практикой.
Если вы хотите, чтобы избежать упаковки все эти вызовы в ваш метод facebook в примерки уловом, вы могли бы сделать что-то подобное, тоже:

//in class containing facebook method: 
private $lastException = null; 
public function getLastException() 
{ 
    return $this->lastException; 
} 

Теперь вы можете изменить свой улов блок facebook метод для:

catch(APIException $e) 
{ 
    $this->lastException = $e; 
    return false; 
} 

И сделать что-то вроде:

$return = $instance->facebook($link); 
if ($return === false) 
{ 
    var_dump($instance->getLastException()); 
    exit($instance->getLastException()->getMessage()); 
} 
+0

Спасибо за ваш ответ, но я не понимаю, почему исключение не брошено в моих ках se, my page return 500 Внутренняя ошибка сервера - FacebookApiException (я использую Symfony2) – Ajouve

+0

Я нашел решение, мне пришлось поймать \ Exception с symfony – Ajouve

+0

@ant: Добавлена ​​дополнительная информация о том, почему '\ Exception' работал на вас (это связано с пространствами имен и разрешением имен классов) –