方法对yaml文件执行递归扫描并解析它们,提取一些信息。我使用sfYamlParser来解析yaml。我在try块中包含对parse()的调用并捕获“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冒出来然后被我的方法捕获。 coe是命名空间,但设置了“use 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))
修改
好的,如果我不抛出另一个异常,我没有致命的错误。抱歉,我预计代码会因为我定义的错误消息而崩溃,而不是原来的异常messgae,所以:
为什么它不会因“解析模型定义'$ filePath'失败而失败。”?
修改
结果证明PHP有一种处理未捕获异常的迭代方法:
如果抛出“new Exception(”MESSAGE“,0,$ previous_exception)”并且没有捕获它,PHP将显示来自$ previous_exception而不是“MESSAGE”的错误消息
答案 0 :(得分:2)
可能是因为你没有捕获你在catch块中抛出的异常。
你必须在catch块中再次停止抛出异常,或者在调用方法中进行新的try catch。