我想捕获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块。
据我所知,这不应该发生。有什么想法吗?
答案 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
的成员。