2010-12-19 103 views
12

我有一个像下面尝试抓住不捕捉异常?

try { 
    $user = $query->getSingleResult(); 
} catch (Doctrine\ORM\NoResultException $e) { 
    return null; 
} catch (Exception $e) { 
    return null; 
} 

getSingleResult()将抛出NoResultException如果没有行被发现的代码。似乎我仍然得到了例外...这个渔获似乎没有工作。这是为什么?

回答

34

如果您的代码命名空间,请尝试使用:

catch (\Doctrine\ORM\NoResultException $e) 

注意的原则命名空间的前面的反斜杠。

你需要这样做的原因是因为PHP的命名空间是相对的,而不是绝对的。

如果您的代码命名空间为My\Namespace,并且您试图捕获Doctrine\ORM\NoResultException,但实际上它试图捕获My\Namespace\Doctrine\ORM\NoResultException

通过以\前缀的命名空间,你让它绝对的(类似于UNIX的路径名)

+0

这很可能是因为用户正在使用_is_命名空间的Doctrine 2。 – lotsoffreetime 2010-12-19 14:56:56

+0

尽管使用Doctrine 2并不强制你命名空间自己的代码。在没有为代码指定名称空间的情况下,命名空间始终假定为根,在这种情况下,您不需要初始\ – 2010-12-20 02:42:44

+0

您也可以只捕获NoResultException并且在文件头中添加'use Doctrine \ ORM \ NoResultException;'。 – 2014-04-08 14:39:04

2

它也可以加入

use Exception; 

在类的顶部,它会解决异常try/catch块中使用的类名称。