【问题标题】:Uncaught exception in try/catch blocktry/catch 块中未捕获的异常
【发布时间】: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-&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))

编辑:

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

为什么它没有失败并显示“解析模型定义'$filePath'失败。”?

编辑:

原来 PHP 有一种迭代方式来处理未捕获的异常:

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

【问题讨论】:

  • 您是否捕获了您在上面指定的 catch 块中抛出的异常?
  • 堆栈跟踪的其余部分是什么样的?
  • “$parser->parse(...)”抛出异常
  • 请发布完整的堆栈跟踪。
  • 如果你确定它发生在第 20 行。删除 try 块并再次运行它。它会告诉你它发生在哪里。

标签: php exception-handling


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    相关资源
    最近更新 更多