【问题标题】:Why isn't my Exception being caught by catch?为什么我的异常没有被 catch 捕获?
【发布时间】:2012-02-24 05:21:07
【问题描述】:

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

# 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

【问题讨论】:

  • 它应该可以工作。您是否可能没有显示实际代码,并抛出一些不扩展 ExceptionRandomLyNamedException
  • 这看起来是正确的。您确定这是您调用此 fileImport 方法的唯一地方吗?如果还有其他人,我会确保他们也被抓到。
  • 如果使用 5.3+,你检查过你的命名空间吗?
  • 我刚刚创建了类,这是调用函数的唯一地方。我还检查了堆栈跟踪中的行号
  • 这是 DataManager 类 pastebin.com/daHWBJDC(为了匿名,有些名称被替换为 ...)

标签: php exception


【解决方案1】:

解决方案

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

思考

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

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

【讨论】:

  • 这很奇怪。感谢您解决这个问题。我来自 Java 背景,完全不知道为什么 try catch 块没有拦截异常。
  • 大声笑...我刚刚意识到我在我的数据类中留下了一个异常处理程序。这说明:p
  • 呸!感谢您回答您自己的问题。没有发现这一点会很痛苦。
  • 只需use Exception; 即可。默认情况下从全局命名空间导入。
【解决方案2】:

奇怪。如果我运行这段代码,我会得到“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.';
}


?>

【讨论】:

  • 这与我正在运行的几乎相同。唯一显着的区别是我的类位于单独的文件和命名空间中
【解决方案3】:

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

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

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

结果

Herp.

【讨论】:

    【解决方案4】:

    4 年后...

    @Hubro,感谢您通过命名空间修复拯救了我!

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

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

    use \Exception;

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

    } catch (\Exception $e) {

    我们都可以从比我更聪明的人那里受益,提供有关为每个命名空间定义自定义异常的最佳实践的建议。有接盘侠吗?

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 2010-11-16
      • 2012-01-22
      • 1970-01-01
      • 2020-11-16
      • 2010-11-25
      相关资源
      最近更新 更多