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 されます (Garbage Collected)。インスタンスはもう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
}

例外をキャッチして何もしない (キャッチしているが false を返す、理由がわからない) ことは、悪い習慣と見なされます。
メソッドへのこれらすべての呼び出しを 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());
}
于 2013-08-07T08:38:48.170 に答える