PHP - 无法捕获Google API lib抛出的异常

时间:2014-03-08 01:06:25

标签: php exception-handling google-api-php-client

我想捕获Google API PHP library引发的异常,但由于某种原因,它会在到达我的catch块之前生成'致命错误:未捕获的异常'。

在我的应用中,我有类似的东西:

try {
    $google_client->authenticate($auth_code);
} catch (Exception $e) {
    // do something
}

这是Google_Client's authenticate()

public function authenticate($code)
{
    $this->authenticated = true;
    return $this->getAuth()->authenticate($code);
}

上面的authenticate($code)Google_Auth_OAuth2::authenticate(),在某些时候会引发异常:

throw new Google_Auth_Exception(
    sprintf(
        "Error fetching OAuth2 access token, message: '%s'",
        $decodedResponse
    ),
    $response->getResponseHttpCode()
);

如果我在Google_Client的身份验证中添加了try / catch块,它会捕获异常,但如果没有它,程序就会死掉,而不是从我的应用程序到达主try / catch块。

据我所知,这不应该发生。有什么想法吗?

2 个答案:

答案 0 :(得分:24)

问题是try / catch块在命名空间文件中,PHP要求你使用“\ Exception”。更多信息:PHP 5.3 namespace/exception gotcha

示例(取自上面的链接):

<?php
namespace test;

class Foo {
  public function test() {
    try {
      something_that_might_break();
    } catch (\Exception $e) { // <<<<<<<<<<< You must use the backslash
      // something
    }
  }
}
?>

答案 1 :(得分:2)

我不确定Google的API的结构是什么,我不是一个真正流畅的PHP程序员,但是你正在捕获Exception的特定异常类型,Google {{1}可能不会继承。

因此,由于你的try-catch块正在寻找属于Google_Auth_Exception的成员并且Exception可能不是Google_Auth_Exception的成员的异常,那么你的try catch块会想念它。

尝试捕获特定的异常。以前在许多不同的语言中发生过这种情况。

修改

您发布的链接从以下位置继承了其例外:​​Google/Auth/Exception Google / Auth / Exception从以下网址继承其例外:Google/Exception Google / Exception扩展了Exception,在此上下文中可能是您​​的类所指的Exception

我的理由是你的try-catch块没有捕获异常是完全错误的,但智慧仍然是真的。尝试捕获特定异常,然后使用Exception查看PHP是否将instanceof识别为Google_Auth_Exception的成员。