我有一些看起来像这样的代码
# 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
答案 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) {
我们都可以从比我更聪明的人那里获益,为每个名称空间定义自定义异常的最佳实践提供建议。任何人?