我的代码中有MappingException。请帮助我如何在代码中找到引发该异常的位置?
[29-Mar-2019 22:30:26 Europe/Moscow] PHP Fatal error: Uncaught DoctrineCommonPersistenceMappingMappingException: 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): DoctrineCommonPersistenceMappingMappingException::nonExistingClass('Client')
#1 /var/www/virtual/account/htdocs/vendor/doctrine/persistence/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php(251): DoctrineCommonPersistenceMappingRuntimeReflectionService->getParentClasses('Client')
#2 /var/www/virtual/account/htdocs/vendor/doctrine/persistence/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php(284): DoctrineCommonPersistenceMappingAbstractClassMetadataFactory->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
如果我做这样的事情会有所帮助,还是我会得到我现在拥有的相同的堆栈跟踪?
try {
// application init
$app->init();
} catch (DoctrineCommonPersistenceMappingMappingException $e) {
error_log("MappingException: " . $e->getTraceAsString());
throw $e;
}
更新
问题与 Doctrine 无关,而是与堆栈跟踪的长度有关,该长度太大并且不适合 1024 字节(默认 php 的设置)。因此,只需要增加堆栈跟踪的最大长度,这可以通过以下命令完成:
ini_set('log_errors_max_len', 0); // 0 - infinity length allow
异常被抛出:
文件:/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 (DoctrineCommonPersistenceMappingMappingException $e) {
error_log("MappingException: " . $e->getTraceAsString());
//no throw
} catch (Exception $e) {
error_log("GeneralExcpeption: " . $e->getTraceAsString());
//no throw
}
您总是捕获从最具体的(在您的情况下是原则)到不太具体的异常(\Exception)
使用 getTrace 可能比使用 getTraceAsString() 更容易查看导致异常的执行顺序。 但是帮自己一个忙,限制你显示的条目数量,即这样:
try {
// application init
$app->init();
//note backslash
} catch (DoctrineCommonPersistenceMappingMappingException $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
的 php 文件顶部有一个namespace
关键字,则需要确保Client
是该namespace
的一部分,或者使用Client
来转义命名空间并将名称Client
视为没有命名空间。
2. 异常被抛出在您的 try catch 块之外(可能不是)
您可以尝试通过向处理程序注册自己的函数来捕获 try/catch 块之外的异常。棘手的部分是,这必须在 php 代码的第一行如此完美地抛出异常之前完成。请注意,这可能与您编写的第一行不同,例如,这可以是应用程序引导.php。 您可以通过使用 Xdebug 运行应用程序进入调试模式来检查您的应用程序第一行是什么。
下面是放置 Exeption 处理程序的示例:
<?php
function exception_handler($e) {
echo "MyUncaughtException: " , $e->getMessage(), "n";
}
set_exception_handler('exception_handler');
问题与教义无关,而是与堆栈跟踪的长度有关,该长度太大并且不适合1024字节(默认php的设置)。因此,只需要增加堆栈跟踪的最大长度,这可以通过以下命令完成:
ini_set('log_errors_max_len', 0); // 0 - infinity length allow