Почему я не получаю исключение, которое я ожидаю в Zend Feed, когда фид неверен?
По сути, у нас есть этот модуль, который мы предлагаем нашим пользователям, которые хотят размещать на своих страницах ленту новостей из других источников. Я отлично работаю, без пота. Проблема заключается в том, что всякий раз, когда пользователи неправильно обращаются со ссылкой на ленту новостей, им приходится вручную удалять модуль из существования, потому что Zend Feed дает сбой и сжигает всю страницу, как и любая фатальная ошибка. Обычно можно ожидать, что такой блок кода, как..
try { // Test piece straight off the Zend tutorial
$slashdotRss = Zend_Feed::import('http://rss.slashdot.org/Slashdot/slashdot');
} catch (Zend_Feed_Exception $e) {
// feed import failed
echo "Exception caught importing feed: {$e->getMessage()}\n";
exit;
}
... будет вести себя, если я войду в 'httn://rss.grrllarrrlll.aarrg/Slashdot/slashdot' и скажу что-то вроде "404" или "Что за дерьмо". Нет, он умирает. Он падает и умирает. Он падает, горит и умирает, полностью игнорируя всю эту счастливую методологию трикотажа.
Итак, в основном, мы должны написать нашу на feedfetch или есть какое-то простое средство от промахов Zend?
Добавлен журнал:
exception 'Zend_Http_Client_Adapter_Exception' with message 'Unable to Connect to tcp://www.barglllrragglll:80. Error #10946: ' in /library/Zend/Http/Client/Adapter/Socket.php:148
#0 /library/Zend/Http/Client.php(827): Zend_Http_Client_Adapter_Socket->connect('www.barglllrragglll...', 80, false)
#1 /library/Zend/Feed.php(284): Zend_Http_Client->request()
...... Trace etc ....
3 ответа
Просто из любопытства, вы пытались поймать другие виды исключений? т.е. не только Zend_Feed_Exception
?
Может быть, если во время фазы "выборки" возникает какая-то ошибка 404, это вызывает другое исключение? (Из-за зависимости от другого компонента, например, Zend_Http_Client
?)
Кроме того, вы проверили error_reporting
уровень, чтобы быть уверенным, что ошибки будут сообщены? Может быть, в каком-то файле журнала где-то, если display_errors
является Off
?
Как sidenot, и не совсем ответ на ваш вопрос, но Zend_Feed
имеет некоторые недостатки (например, возвращает разные типы данных в зависимости от формата канала - например, RSS против ATOM).
Начиная с Zend Framework 1.9 (сейчас он доступен только в виде предварительного просмотра или альфа-версии, поэтому не используйте его в работе!), Будет Zend_Feed_Reader
компонент, который должен быть более полезным при использовании RSS-каналов и каналов ATOM.
Для получения дополнительной информации см.
- Предварительный выпуск Zend Framework 1.9.0 уже доступен
- Zend_Feed_Reader: одобрен для боя!
- Предложение компонента Zend_Feed_Reader
Изменить после добавления журнала
За Zend_Feed
, нет проблем с самим потоком, поэтому он не бросает Zend_Feed
исключение
Здесь у вас есть другая проблема, например, неправильный URL: он не может получить данные, а не проанализировать их; это объясняет, почему исключение не Zend_Feed
связанные, но Zend_Http_Client
-связанные с.
Вы могли бы хотеть добавить некоторый другой код обработки исключений; что-то вроде этого:
try { // Test piece straight off the Zend tutorial
$slashdotRss = Zend_Feed::import('http://rss.slashdot.org/Slashdot/slashdot');
} catch (Zend_Feed_Exception $e) {
// feed import failed
echo "Exception caught importing feed: {$e->getMessage()}\n";
exit;
} catch (Zend_Http_Client_Exception $e) {
echo "There is something wrong with the URL you provided for the feed";
exit;
} catch (Exception $e) {
echo "There is something wrong, we don't know what...";
exit;
}
Сюда:
- Если канал недействителен, вы можете сказать пользователю
- Если есть проблема, связанная с HTTP, вы также можете сообщить об этом пользователю.
- Если есть другая проблема, о которой вы не задумывались, она все равно не падает
Как насчет чего-то вроде
$file = file(" http://rss.grrrrrrrl...");
$rss = Zend_Feed::importString($file);
?
Эй, вы не ловите правильный тип исключения, попробуйте поймать
Zend_Http_Client_Adapter_Exception
или все сразу:
поймать (исключение $e)
Кстати, у него есть метод toString, так что вы можете просто повторить $ e без необходимости getMessages.