Как найти место в коде, где возникли исключения Doctrine? - PullRequest
1 голос
/ 30 марта 2019

Где-то в моем коде было исключение MappingException.Пожалуйста, помогите мне, как найти место в коде, где возникает это исключение?

[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

Если я сделаю что-то подобное, это поможет или я получу ту же трассировку стека, что и сейчас?

try {
    // application init
    $app->init();
} catch (Doctrine\Common\Persistence\Mapping\MappingException $e) {
    error_log("MappingException: " . $e->getTraceAsString());
    throw $e;
}

ОБНОВЛЕНИЕ

Проблема связана не только с Doctrine, но и с длиной трассировки стека, которая слишком велика и не соответствует 1024 байта (по умолчанию php'sустановка).Таким образом, просто необходимо увеличить максимальную длину трассировки стека, что можно сделать с помощью следующей команды:

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

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

Проблема связана не только с Doctrine, но и с длиной трассировки стека, которая слишком велика и не умещается в 1024 байта (настройка php по умолчанию). Итак, просто нужно увеличить максимальную длину трассировки стека, что можно сделать с помощью следующей команды:

ini_set('log_errors_max_len', 0); // 0 - infinity length allow
0 голосов
/ 30 марта 2019

Исключение было выдано в:

файл: /var/www/virtual/account/htdocs/vendor/doctrine/persistence/lib/Doctrine/Common/Persistence/Mapping/MappingException.php

строка: 93

Если вы хотите увидеть, что произошло раньше (причину), вы можете проверить трассировку своего кода.Я не вижу весь ваш код, но:

Если у вас есть исключение Uncaught , даже если вы завернули свой код блоком 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
}

Вы всегда отлавливаете исключения, начиная от самых специфических (в вашем случае доктрины) до менее специфичных (\ 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, и убедитесь, что вы правильно использовали этого Клиента в пространстве имен, которым вы являетесь.,Если в верхней части php-файла, где вы используете Client, есть ключевое слово namespace, вы должны быть уверены, что Client является частью этого namespace или использовать \Client для выхода из пространства имен и обработки имениClient как будто не было пространства имен.

2.Исключение выдается за пределами вашего блока try catch (возможно, нет)

Вы можете попытаться перехватить исключения, которые находятся за пределами вашего блока try / catch, зарегистрировав собственную функцию с помощью обработчика.Сложность заключается в том, что это необходимо сделать до того, как исключение будет выдано так идеально в первой строке кода php.Обратите внимание, что это может отличаться от первой строки, которую вы написали, например, это может быть приложение bootstrap.php.Вы можете проверить, что является вашей первой строкой приложения, запустив приложение с Xdebug в режиме отладки.

вот пример помещения обработчика исключений:

<?php
function exception_handler($e) {
  echo "MyUncaughtException: " , $e->getMessage(), "\n";
}

set_exception_handler('exception_handler');
...