try / catch块中未捕获的异常

时间:2012-02-19 16:35:40

标签: php exception-handling

方法对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-&gt;parse('type:         s...')
#1 [...]/packages/fabpot-yaml/sfYamlParser.php(201): sfYamlParser-&gt;parse('explicitPrivile...')
#2 [...]/packages/hydra/source/com/daliaIT/hydra/Indexer.php(20): sfYamlParser-&gt;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-&gt;scanCallback('packages/hPacks...', 'hmd', Object(Closure))

修改

好的,如果我不抛出另一个异常,我没有致命的错误。抱歉,我预计代码会因为我定义的错误消息而崩溃,而不是原来的异常messgae,所以:

为什么它不会因“解析模型定义'$ filePath'失败而失败。”?

修改

结果证明PHP有一种处理未捕获异常的迭代方法:

如果抛出“new Exception(”MESSAGE“,0,$ previous_exception)”并且没有捕获它,PHP将显示来自$ previous_exception而不是“MESSAGE”的错误消息

1 个答案:

答案 0 :(得分:2)

可能是因为你没有捕获你在catch块中抛出的异常。

你必须在catch块中再次停止抛出异常,或者在调用方法中进行新的try catch。