0

我想获得我的 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'))) 

谢谢你的帮助

4

1 回答 1

2

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

use \APIException;

设置APIException为 的别名\APIException还要检查这个链接。没有使用 FB API,我不知道它是否仍然相关,但假设 facebook api 存储在您的供应商目录中,您必须在使用 Facebook api 时指定正确的命名空间。
起作用的原因\Exception仅仅是因为,如链接页面所示,APIException该类从\Exception基类扩展,因此类型提示起作用。这并不重要,但通常最好在正确的位置捕获正确的异常。

抛出异常,您使用catch块捕获它。到目前为止一切都很好,但是,它被捕获在方法的范围内,当该方法返回时,它被 GC(垃圾收集)。Exception实例不再存在。
通常,如果您想访问方法之外的异常(很可能在调用该方法的代码中),您只是不捕获异常。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方法的调用包装在 try-catch 中,您也可以执行以下操作:

//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());
}
于 2013-08-07T08:38:48.170 回答