抛出APIException Facebook api php

时间:2013-08-07 08:19:17

标签: php facebook exception

我想得到我的api例外,但我不明白该怎么做。 这是我的代码

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;
}

所以我想在异常的情况下返回false。

我得到了例子:

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

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

由于您已经评论过您正在使用symfony,并且使用catch(\Exception $e)修复了类型提示,因此您可能需要考虑将其添加到文件的顶部:

use \APIException;

APIException设置为\APIException的别名。 Also check this link。没有使用FB API,我不知道它是否仍然相关,但假设facebook api存储在你的供应商目录中,你必须在使用Facebook api时指定正确的命名空间。
\Exception工作的原因仅仅是因为,如链接页面所示,APIException类从\Exception基类扩展,因此类型提示有效。这并不重要,但通常最好在正确的地方捕捉到正确的例外。

抛出异常,然后使用catch块捕获它。到目前为止,这很好,但是,它被捕获在方法的范围内,当该方法返回时(GC收集垃圾)。 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
}

捕捉异常并且没有做任何事情(你正在捕捉但是返回虚假,无法知道为什么)被认为是不好的做法。
如果你想避免在try-catch中将所有这些调用包装到facebook方法中,你也可以这样做:

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

现在,您可以将facebook方法的catch块更改为:

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

做类似的事情:

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