Метод выполняет рекурсивное сканирование файлов yaml и анализирует их, извлекает часть информации. Я использую sfYamlParser для анализа yaml. Я включил вызов parse () в блоке try и поймал «Exception $ e», но я все равно получаю «Неустранимая ошибка: непоставленное исключение».
try{ $definition = $parser->parse(file_get_contents($filePath));//line 20 } catch(Exception $e) { throw new Exception("Parsing model definiion '$filePath' failed.", 0, $e); }
Фрагмент из трассировки стека:
...Indexer.php(20): sfYamlParser->parse('type: com...') #3
Почему исключение не попало в мой блок catch? Я ожидал, что Exception начнет пузыриться, а затем поймается в моем методе. Коэффициент присваивается именам, но устанавливается «Использовать исключение».
Ошибка обмена сообщениями:
Fatal error</b>: Uncaught exception 'InvalidArgumentException' with message 'Unable to parse line 30 (key; true).' in [...]/packages/fabpot-yaml/sfYamlParser.php:265 Stack trace: #0 [...]/packages/fabpot-yaml/sfYamlParser.php(201): sfYamlParser->parse('type: s...') #1 [...]/packages/fabpot-yaml/sfYamlParser.php(201): sfYamlParser->parse('explicitPrivile...') #2 [...]/packages/hydra/source/com/daliaIT/hydra/Indexer.php(20): sfYamlParser->parse('type: com...') #3 [...]/packages/co3/source/com/daliaIT/co3/PathHelper.php(97): com\daliaIT\hydra\{closure}('packages/hPacks...') #4 [...]/packages/hydra/source/com/daliaIT/hydra/Indexer.php(28): com\daliaIT\co3\PathHelper->scanCallback('packages/hPacks...', 'hmd', Object(Closure))
РЕДАКТИРОВАТЬ:
Хорошо, если я не создаю другого исключения, я не получаю фатальной ошибки. Извините, я ожидал, что код сработает с сообщением об ошибке, которое я определил, а не с оригинальной мессенджей исключения, поэтому:
почему он не сработает с «Определение модели Parsing» $ filePath «не удалось»??
РЕДАКТИРОВАТЬ:
Оказывается, PHP имеет истребительный способ справиться с неперехваченными исключениями:
Если вы выбросите «новое исключение» («MESSAGE», 0, $ previous_exception) и не поймаете его, PHP отобразит сообщение об ошибке из $ previous_exception и NOT «MESSAGE»,
Вероятно, потому что вы не поймаете исключение, которое вы выбрали в блоке catch.
Вы должны либо перестать бросать исключение в блок catch, либо сделать новую попытку поймать / в вызывающем методе.