Почему мое исключение не ловится на улов? - PullRequest
19 голосов
/ 01 февраля 2012

У меня есть код, который выглядит так

# 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');
}

И все же я получаю

Неустранимая ошибка: необработанное исключение «Исключение» с сообщением «НЕКОТОРЫЕ ИСКЛЮЧЕНИЯ» ...

Из блока try. Также "Герп." никогда не печатается. Почему исключение не вызывает блок catch?


РЕДАКТИРОВАТЬ: я должен отметить, что я использую Тоник и PHP 5.3.9

ВНОВЬ РЕДАКТИРОВАТЬ: Вот DataManager (имена заменены на ... для анонимности) http://pastebin.com/daHWBJDC

Ответы [ 4 ]

45 голосов
/ 01 февраля 2012

Решение

Я не указывал use \Exception; в файле, содержащем попытку / улов.

Обдумывание

Я знаю, что намеренно каждое пространство имен в PHP должно определятьего исключение по многим причинам, но я все еще нахожу странным, что catch(Exception e) не вызывало никаких ошибок, когда Exception в этом контексте не было определено.Если бы я написал new Exception(), я бы получил ошибку.

Ну, по крайней мере, я кое-что узнал.

3 голосов
/ 01 февраля 2012

Странно. Если я запускаю этот код, я получаю «Герп».

<?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 голосов
/ 01 февраля 2012

Возможно, у вас возникла проблема с вашим классом DataManager, потому что я скопировал ваш код, адаптировал его для запуска и обработал исключение ... Ваша проблема в другом месте ...

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

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

Результаты в

Herp.
0 голосов
/ 30 апреля 2018

4 года спустя ...

@ Hubro, спасибо, что спасли меня с этим исправлением пространства имен!

Поначалу кажется нелогичным, что это необходимо при создании Исключения корневого уровня, даже если это в конечном счете имеет смысл в общем контексте пространств имен.

Для тех, кто не хочет использовать исправление на уровне файлов @ Hubro:

use \Exception;

Вместо этого вы можете добавить обратную косую черту перед Exception в блоке catch верхнего уровня:

} catch (\Exception $e) {

Мы все могли бы извлечь выгоду из того, что кто-то умнее меня предоставит рекомендации по передовым методам определения пользовательского исключения для каждого пространства имен. Любой берущий?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...