为什么我的异常不被catch捕获?

时间:2012-02-01 14:18:54

标签: php exception

我有一些看起来像这样的代码

# Try to import file
try
{
    DataManager::fileImport($_FILES['datafile']['tmp_name'], 
                            $_POST['zones'], $_POST['statuses']);
}
catch(Exception $e)
{
    print 'Herp.';
    $response->body = Helpers::getVarDump($e);
}

DataManager::fileImport实际上是一个抛出正常异常的单行函数:

static function fileImport($filepath, $zones, $statuses)
{
    throw new Exception('SOME EXCEPTION');
}

但是我得到了

  

致命错误:未捕获的异常'Exception',消息'SOME EXCEPTION'...

来自try块。也是'赫普。'永远不会打印。为什么Exception不会触发catch块?


编辑:我应该提到我正在使用Tonic和PHP 5.3.9

再次编辑:这是DataManager(名称替换为......匿名)http://pastebin.com/daHWBJDC

4 个答案:

答案 0 :(得分:44)

解决方案

我忽略了在包含try / catch的文件中指定use \Exception;

思考

我知道PHP中的每个命名空间都应该定义自己的Exception有很多原因,但我仍然觉得catch(Exception e)在该上下文中Exception没有导致任何错误时很奇怪定义。如果我写new Exception(),我会收到错误。

哦,好吧,至少我学到了一些东西。

答案 1 :(得分:3)

奇怪。如果我运行此代码,我会得到“Herp。”

<?php

class DataManagerTest {
    static function fileImport($filepath, $zones, $statuses)
    {
        throw new Exception('SOME EXCEPTION');
    }
}

# Try to import file
try
{
    DataManagerTest::fileImport("param1","param2","param3");
}
catch(Exception $e)
{
    print 'Herp.';
}


?>

答案 2 :(得分:1)

您的DataManager类可能有问题,因为我复制了您的代码,使其适应运行并且我处理了异常......您的问题在其他地方......

class DataManager {
    static function fileImport($filepath, $zones, $statuses){
        throw new Exception('SOME EXCEPTION');
    }
}

try{
    DataManager::fileImport('', '', '');
}catch(Exception $e){
    print 'Herp.';
}

结果

Herp.

答案 3 :(得分:0)

4年后......

@Hubro,感谢您使用该命名空间修复程序保存我!

一开始似乎违反直觉,在抛出根级别Exception时它是必要的,即使它最终在命名空间的一般上下文中有意义。

对于任何不想使用@ Hubro的文件级修复程序的人:

use \Exception;

您可以在更高级别的catch块中在Exception前添加反斜杠:

} catch (\Exception $e) {

我们都可以从比我更聪明的人那里获益,为每个名称空间定义自定义异常的最佳实践提供建议。任何人?