php - try block 中的代码在异常后继续执行?

标签 php try-catch google-plus

我正在尝试在我的网站上实现 Google+ 登录,但遇到了问题。这是我的代码(在创建 Google_Client 对象之后):

try {
    $client->authenticate($_GET['code']);

    $plus = new \Google_Service_Plus($client);
    $person = $plus->people->get('me');

    $firstName = $person->modelData->name->givenName;

} catch (Google_Auth_Exception $e) {
    $response = array(
        'error' => 'Error: Authentication exception.'
    );
} catch (Exception $e) {
    $response = array(
        'error' => 'Error: Uncaught exception.'
    );
}
  1. $client->authenticate() 如果传递给它的代码无效,则抛出 Google_Auth_Exception
  2. 如果身份验证失败,则从 $person 对象读取属性会导致 fatal error
  3. $response作为 JSON 编码对象回显

问题是 try/catch 代码似乎没有正常工作。当由于 $_GET['code'] 中的代码无效导致身份验证失败时,脚本将返回以下响应:

{"error":"Error: Authentication exception."}

到目前为止一切顺利 -- 第一个 catch block 中的代码已执行。

但是,try block 中的代码继续以一种奇怪的方式执行。我说“奇怪”是因为在上面的形式中,出现了一堆错误(最终导致 fatal error ),这意味着这一行:

$firstName = $person->modelData->name->givenName;

还是执行!它应该被执行,因为在前一行抛出异常。如果我注释掉上面的行,则不会抛出错误(再次表明该行已执行,这是不应该的)。

以下是由于抛出异常之后执行上述行而输出的错误:

Notice: Undefined index: modelData in [...]\google-api-php-client-master\src\Google\Model.php on line 78

Notice: Trying to get property of non-object in [...]\ajax_handler.php on line 720 [note: this is the line shown above, where the property is being accessed]

Notice: Trying to get property of non-object in [...]\ajax_handler.php on line 720

我说“奇怪”的另一个原因是如果我添加这一行:

die('dying before reading property');

就在上一行之前(我读取属性的地方),没有发生错误,但是“在读取属性前死亡”文本没有输出到页面上!这很奇怪,因为在抛出错误后脚本显然仍在执行 try block 中的代码(因为没有此 die() 行,将执行读取属性的行并导致输出大量错误)。与之前一样,catch block 中的代码仍会执行,并将 JSON 输出到页面上。

到底是怎么回事?

最佳答案

PHP 是一种编译语言。参见 this questionthis answer寻求解释。

基本上,代码在执行之前被解析、组装并编译成字节码;您的脚本发生了什么是代码无效。语法是正确的,所以 PHP 不会完全失败。在构造对象 $person 之后,当您尝试访问不存在或由于其范围而无法访问的动态属性 (modelData) 时,就会出现问题。所以你看到的错误是因为 PHP 找不到它。

代码没有输出'dying before reading property'的原因是因为代码实际上并没有被执行,所以它不能“停止”执行;它已经停止了。

改变

$firstName = $person->modelData->name->givenName;

$firstName = $person->name->givenName;

你应该可以开始了。

关于php - try block 中的代码在异常后继续执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23869000/

相关文章:

php - Magento 文件夹更改

php - 使用 trim 从字符串中删除单引号后跟空格

java - try-catch around 回调

javascript - 您如何/可以使用 PHP 访问 Google+ 登录 SessionState?

search - 如何将网站链接到 google+,以便个人资料图片出现在搜索中

php - 如何使用 PHP 删除回车符?

php - 根据产品 ID 在 WooCommerce 感谢页面上添加自定义消息

exception - Swift 中的 try-catch 异常

java - 如何在 kotlin 中使用 try-resources?

python - Google+ 登录 - 服务器端流程 - Python - Google App Engine