【问题标题】:Exception Thrown In Parent Class Not Caught In Child Class父类中抛出的异常未在子类中捕获
【发布时间】:2012-02-09 12:24:29
【问题描述】:

使用 Facebook PHP SDK 时会发生此错误,但我实际上认为这是一般错误。

当我运行这段代码时,一切正常,异常被捕获:

$facebook = new Facebook('appId'=>APP_ID,'secret'=>APP_SECRET);
try {
    $user_profile = $facebook->api('/me','GET');
    echo "Name: " . $user_profile['name'];
} catch(FacebookApiException $e) {
    $login_url = $facebook->getLoginUrl(); 
    echo 'Please <a href="' . $login_url . '">login.</a>';
}

但是当我运行这段代码时:

$facebook = new Facebook_Extended('appId'=>APP_ID,'secret'=>APP_SECRET);
$facebook->api_extended();

扩展类的方法如下所示:

// Overrides parent::api()
public function api() {
    try {
        $user_profile = parent::api('/me','GET');
        echo "Name: " . $user_profile['name'];
    } catch(FacebookApiException $e) {
        $login_url = $this->getLoginUrl(); 
        echo 'Please <a href="' . $login_url . '">login.</a>';
    } 
}

我收到“未捕获的 OAuthException”错误。

任何想法为什么无法在子类中捕获异常?

【问题讨论】:

  • 您可以发布您的解决方案作为答案,然后在几天后您将被允许将其标记为已接受。

标签: php exception namespaces php-5.3


【解决方案1】:

我没有意识到这是一个问题,但是这个类在一个命名空间中,所以我需要在我的异常中添加一个“\”:

catch (\FacebookApiException $e)

http://onehackoranother.com/logfile/2009/01/php-5-3-exception-gotcha

【讨论】:

  • 当我无法在命名空间中的 child 类中捕获异常时遇到了同样的问题,但它被父类强烈识别。添加前导斜杠和它帮助,谢谢提示!
【解决方案2】:

堆栈跟踪会更有帮助。 暂时试试下面的

public function api_extended() {
try {
    $user_profile = parent::api('/me','GET');
    echo "Name: " . $user_profile['name'];
} catch(FacebookApiException $e) {
    $login_url = $this->getLoginUrl(); 
    echo 'Please <a href="' . $login_url . '">login.</a>';
} catch (Exception $err){
    print_r($err->getTrace());
}

}

【讨论】:

  • 仍然返回“Uncaught OAuthException”——我也尝试过“catch (OAuthException $e)”。没有运气。
【解决方案3】:

api 方法不是静态的,所以你不应该这样使用它:

$user_profile = $this->api('/me','GET');

如果没有,您可以随时为通用异常添加另一个 catch 块,以便查看发生了什么问题。

public function api_extended() {
    try {
        $user_profile = parent::api('/me','GET');
        echo "Name: " . $user_profile['name'];
    } catch(FacebookApiException $e) {
        $login_url = $this->getLoginUrl(); 
        echo 'Please <a href="' . $login_url . '">login.</a>';
    } catch(Exception $e) {
        var_dump($e);
    } 
}

【讨论】:

  • 糟糕,我的函数实际上覆盖了“api”(编辑了原始帖子以反映),但我确实尝试将其重命名为“api_extended”,然后使用“$this->api”调用另一个 api 方法" - 仍然是同样的错误。而且我还尝试了通用异常的想法。还是一样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 1970-01-01
  • 2011-08-21
  • 2019-10-20
相关资源
最近更新 更多