【发布时间】:2012-02-19 16:35:40
【问题描述】:
一种方法对 yaml 文件执行递归扫描并解析它们,提取一些信息。我使用 sfYamlParser 来解析 yaml。我将对 parse() 的调用包含在一个 try 块中并捕获“异常 $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 块没有捕获到异常? 我确实希望异常会冒泡然后被我的方法捕获。 coe 已命名空间,但设置了“使用异常”。
错误信息:
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))
编辑:
好的,如果我不抛出另一个异常,我不会收到致命错误。抱歉,我预计代码会因我定义的错误消息而崩溃,而不是原始异常消息,所以:
为什么它没有失败并显示“解析模型定义'$filePath'失败。”?
编辑:
原来 PHP 有一种迭代方式来处理未捕获的异常:
如果你抛出一个 "new Exception("MESSAGE", 0,$previous_exception)" 并且没有捕获它,PHP 将显示来自 $previous_exception 而不是 "MESSAGE" 的错误消息
【问题讨论】:
-
您是否捕获了您在上面指定的 catch 块中抛出的异常?
-
堆栈跟踪的其余部分是什么样的?
-
“$parser->parse(...)”抛出异常
-
请发布完整的堆栈跟踪。
-
如果你确定它发生在第 20 行。删除 try 块并再次运行它。它会告诉你它发生在哪里。