如何在代码中找到引发Doctrine异常的地方?

时间:2019-03-29 21:57:41

标签: php debugging exception doctrine-orm doctrine

我的代码中某处有MappingException。请帮助我如何在代码中找到引发异常的地方?

s = len(a) - i
np.concatenate([c, diff[np.random.choice(diff.shape[0], size=s, replace=False), :]], axis=0)

如果我会做类似的事情会有所帮助,还是会得到与现在相同的堆栈跟踪信息?

array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7]])

更新

问题与Doctrine并不完全相关,但与堆栈跟踪的长度有关,堆栈跟踪的长度太大且不能容纳1024个字节(默认php的设置)。因此,只需增加堆栈跟踪的最大长度即可,这可以通过以下命令完成:

[29-Mar-2019 22:30:26 Europe/Moscow] PHP Fatal error:  Uncaught Doctrine\Common\Persistence\Mapping\MappingException: Class 'Client' does not exist in /var/www/virtual/account/htdocs/vendor/doctrine/persistence/lib/Doctrine/Common/Persistence/Mapping/MappingException.php:93
Stack trace:
#0 /var/www/virtual/account/htdocs/vendor/doctrine/persistence/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php(24): Doctrine\Common\Persistence\Mapping\MappingException::nonExistingClass('Client')
#1 /var/www/virtual/account/htdocs/vendor/doctrine/persistence/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php(251): Doctrine\Common\Persistence\Mapping\RuntimeReflectionService->getParentClasses('Client')
#2 /var/www/virtual/account/htdocs/vendor/doctrine/persistence/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php(284): Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory->getParentClasses('Client')
#3 /var/www/virtual/account/htdocs/vendor/doctrine/orm/lib/Doc in /var/www/virtual/account/htdocs/vendor/doctrine/persistence/lib/Doctrine/Common/Persistence/Mapping/MappingException.php on line 93

2 个答案:

答案 0 :(得分:0)

在以下位置抛出了异常:

  

文件:   /var/www/virtual/account/htdocs/vendor/doctrine/persistence/lib/Doctrine/Common/Persistence/Mapping/MappingException.php

     

行:93

如果您想查看之前发生的情况(原因),可以检查代码的跟踪情况。我看不到整个代码,但:

如果您有未捕获异常,即使您用try catch块包装了代码,这里也只有两种主要方法:

1。您不会捕获异常。可能是因为未转义要捕获的异常,或者异常与尝试捕获的异常不同。或者您将其重新抛出(可能是您的案件)

尝试通过这种方式\Exception

try {
    // application init
    $app->init();
} catch (\Exception $e) {
    error_log("MappingException: " . $e->getTraceAsString());
    //no throw
}

如果这可行,那么您可以更改代码以具有捕获异常的方式

try {
    // application init
    $app->init();

//note backslash
} catch (\Doctrine\Common\Persistence\Mapping\MappingException $e) {
    error_log("MappingException: " . $e->getTraceAsString());
    //no throw

} catch (\Exception $e) {
    error_log("GeneralExcpeption: " . $e->getTraceAsString());
    //no throw
}

您总是会捕获异常,从最具体的(在您的情况下为Doctrine)到不太具体的(\ Exception)

使用getTrace可能比使用getTraceAsString()来查看导致异常的执行顺序要容易得多。 但是请帮自己一个忙,并限制您显示的条目数量,例如:

try {
    // application init
    $app->init();

//note backslash
} catch (\Doctrine\Common\Persistence\Mapping\MappingException $e) {

    var_export(array_slice($e->getTrace(), 0, 5));
    //no throw

} catch (\Exception $e) {

    var_export(array_slice($e->getTrace(), 0, 5));
    //no throw
}

,然后返回到您使用Client的位置(如果数字5不够用),则将其增加到10、15等,以便能够返回到发生异常之前执行的位置。每个条目都有文件和行号,因此您可以重新创建发生的事情。

看一下您的Client所在的代码,并检查您是否在名称空间中正确使用了该Client。如果您使用namespace的php文件顶部有一个Client关键字,则需要确保Client是该namespace的一部分或使用{{1 }}转义名称空间,并将名称\Client视为没有名称空间。

2。异常抛出在try catch块之外(可能不是)

您可以通过向处理程序注册自己的函数来尝试捕获try / catch块之外的异常。棘手的部分是必须在将异常完美地抛出到php代码的第一行之前完成此操作。请注意,这可能与您编写的第一行不同,例如,它可以是应用程序bootstrap.php。 您可以通过在调试模式下运行Xdebug来检查应用的第一行。

这是放置异常处理程序的示例:

Client

答案 1 :(得分:0)

问题与Doctrine并不完全相关,但与堆栈跟踪的长度有关,堆栈跟踪的长度太大且不能容纳1024个字节(默认php的设置)。因此,只需增加堆栈跟踪的最大长度即可,这可以通过以下命令完成:

ini_set('log_errors_max_len', 0); // 0 - infinity length allow