我正在尝试在我的网站上实现 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.'
);
}
$client->authenticate()
如果传递给它的代码无效,则抛出 Google_Auth_Exception- 如果身份验证失败,则从
$person
对象读取属性会导致 fatal error $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 question和 this 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/