Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Exceptions

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Принцип работы
Opposite
Отправлено: 18 Марта, 2012 - 14:26:01
Post Id



Гость


Покинул форум
Сообщений всего: 109
Дата рег-ции: Март 2012  


Помог: 4 раз(а)




Вопрос больше на теорию, чем на практику.

Когда сгенерировалось исключение, его должен обработать клиентский код ( тот, что выше по иерархии, условно говоря).

Мне надо, чтобы программа продолжила свою работу, но при этом выполнила поиск файла в другом месте и попробовала проделать то же самое действие заново.

Грубо говоря :

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. class Conf {
  4.    private $file;
  5.    private $xml;
  6.    private $lastmatch;
  7.    
  8.    public function __construct($file) {
  9.        if(!file_exists($file)) {
  10.            throw new Exception("Файл $file не найден");
  11.        } else $this->file = $file;
  12.        $this->xml = simplexml_load_file($file);
  13.    }
  14. }
  15. try {
  16.    $file = "enew.xml"; // файла enew.xml нет в корневой директории
  17.    $conf = new Conf(); // => будет исключение
  18.    echo 'user: ' . $conf->get('user') . '<br />';
  19.    echo 'host: ' . $conf->get('host') . '<br />';
  20.    $conf->set('port', '3305');
  21.    //$conf->write();
  22. }
  23. catch (Exception $e) {
  24.    // код поиска в новом месте => находим $file в "xmls/"
  25.    // $file = "xmls/enew.php";
  26.    // как заставить код выше выполниться заного?
  27. }
  28. ?>
  29.  

Я уже понял, что процесс можно убить после исключения, но мне это не надо ... надо, чтобы перехватчик исключений catch исправил проблему и попробовал выполнить то же самое, но с другим значением $file. Неужели, чтобы он выполнился, необходимо его тупо переписать? Или Exception-ы так устроены, что они возвращаются в точку своего "возникновения" Не понял ?

(Добавление)
Я не хочу быть индусом, но разве не так? Не понял
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. try {
  4.   $file = "enew.xml"; // файла enew.xml нет в корневой директории
  5.   $conf = new Conf(); // => будет исключение
  6.   echo 'user: ' . $conf->get('user') . '<br />';
  7.   echo 'host: ' . $conf->get('host') . '<br />';
  8.   $conf->set('port', '3305');
  9.   //$conf->write();
  10. }
  11. catch (Exception $e) {
  12.   // код поиска в новом месте => находим $file в "xmls/" => $file = "xmls/enew.php";
  13.   $file = "xmls/enew.php";
  14.   $conf = new Conf();
  15.   echo 'user: ' . $conf->get('user') . '<br />';
  16.   echo 'host: ' . $conf->get('host') . '<br />';
  17.   $conf->set('port', '3305');
  18.   //$conf->write();
  19. }
  20. ?>
  21.  


Неужели других вариантов нет?

(Отредактировано автором: 18 Марта, 2012 - 14:36:28)

 
 Top
DlTA
Отправлено: 18 Марта, 2012 - 14:47:04
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




непонятно зачем тут исключение

в цикле
если файл не найден функция вернула null, и произвели поиск иного файла
если вернули чет полезное или закончились варианты, то вышли из цикла

а так же не стоило в конструктор загонять поиск файл и возврат значения,
для этого корректней было сделать отдельный метод, который уже вызывался б в конструкторе (если передан параметр)

в случае с отдельным методом можно было бы в цикле обращаться к нему, а не плодить немеряное количество объектов
 
 Top
Opposite
Отправлено: 18 Марта, 2012 - 14:47:09
Post Id



Гость


Покинул форум
Сообщений всего: 109
Дата рег-ции: Март 2012  


Помог: 4 раз(а)




Вы не смотрите это как на готовый код : я его взял лишь для примера. Мне надо только понять смысл исключений : вывести ошибку я всегда смогу, но мне хотелось бы перезапустить процесс по новому с другим параметром, и уж если не найдет совсем, то выбрать другое исключение и наконец выдать ошибку. Получается, надо становится индусом и писать то же самое? Шлепать функции, я считаю, бессмысленно под код, который вызывается 2 раза за все время.
 
 Top
DlTA
Отправлено: 18 Марта, 2012 - 14:52:36
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




Opposite пишет:
Шлепать функции, я считаю, бессмысленно под код, который вызывается 2 раза за все время.
сегодня только 2 раза
а пройдет пол годика и там уже будет видно

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

второй метод по сравнению с первым выглядит глупо (в начале)
но что там будет дальше зависит от реализации.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB