vasa_c вот вот, ты точно меня не понял 1. Да 2. В том то и дело, что с Хэндлером ничего не убивается, точнее сам пользователь программы решает убивать или нет. Я предложил 2 альтернативы, на мой взгляд лучшие: первое, сторонней библиотеке выдвать трригер со своим ключём trigger_error("",MY_KEY); и второй, мне больше всего нравится, сделать внутренний Handler, короче юзверь сам устанавливает обратную функцию для вывода ошибки А лучше они тем, что не нужно везде тыкать тру и катч
Mr.M.I.T. т.е. ты предлагаешь перед каждым вызовом каждого метода делать установку специального хэндлера для именно этого метода этого класса, а после вызова возвращаться к стандартному? И это проще, чем try? А как вернуть логику из хэндлера в точку выполения сразу за вызовом да чтобы еще было понятно, произошла ошибка или нет? Хочется увидеть реализацию без эксепшенов вот такого, например, куска (загрузка неких данных из неких файлов, если они есть): PHP: <?php try { $data->readFrom('one.dat'); $data->readFrom('second.dat'); $data->readFrom('third.dat'); } catch (DataException $e) {}
Тру и катч нужно тыкать не везде, а там где это нужно. Можно нигде. Можно один раз на всё программу. Т.е. сторонняя библиотека должна знать о том, что в системе в которую её внедряют реализована вот такая вот хитропопая вещь с trigger_error? Исключительная ситуация это далеко не всегда ошибка и далеко не всегда её следует обрабатывать путём вывода чего-то.
не не не перед вызовом класса, один раз, где-нибудь при инициализации я начинал говорить про фатальные зачем? если нет в системе такой хитропопой вещи, она просто будет делать дефолтную обработку ошибки своим алгоритмом
вообще я предлогаю комбинировать для фатальных юзать каллбэк для нотисных исключения, хотя опять таки, мне удобно в этом случае просто возвращать false напрмер, таким образом, я их не использую вообще.
кстати вопрос: есть у меня место в методе, где может произойти что-то такое, ... а) после чего его работу стоит прекратить и сообщить классу выше информацию об ошибке (бросаем исключение) б) все прошло гладко, ничего делать не нужно в) что-то пошло не так, но ошибка как бы не критическая. Нужно продолжить работу, но сообщить классу выше что не все спокойно в королевстве Датском. Что предложите по пункту "в"?
А этот случай даже теоретически не предназначен для исключений =) Можно для этого сделать или вложенный блок, или сделать вызов внешнего метода. Такие случаи и в других языках не ловятся с помощью try/catch/finally.
так я как бе не намекаю на ущербность пыха, мне интересно как поступать в таких случаях. Да, такой ситуевины еще не было, но мне интересно. Пока как вариант можно хранить ошибки внутри в переменной а потом смотреть какого они типа и выплескивать из.
Koc А можешь дать пример на вариант в)? Хотя кажется придумал: Надо получить некоторые данные из БД. Если не получается, то подгрузить данные из файла и проинформировать пользователя, что это может быть не самая последняя версия данных. Наверное вместе с данными придется возвращать некий код: -1 - ошибка (можно не возвращать, а выбрасывать исключение) 0 - данные из БД 1 - данные из файла
еще такой вариант: PHP: <? try { // получить данные из БД } catch DBEsception $e { // получить из файла // если совсем хреново - файла нет throw new ClassFileException(); // все не так уж плохо, файл есть, но нужно уведомить о том, что база недоступна throw new ClassDBException(); } и в классе выше ловим по типам
блин. Затупил. Тогда только возвращать массивом data, status или передавать в метод какую-то переменную, в которой будет результат потом
кажется, класс на себя много берёт. ИМХО, должно быть два: один работает с БД, второй с файлами: PHP: <?php $message = $data = null; try { $data = $db->getData(); } catch (DbException $e) { $message = $e->getMessage(); try { $data = $files->getData(); } catch (FilesException $fe) { throw new FatalException('Жопа'); } } ?>
Это вы описали функцию getData из моего примера. HTML: <!--первая страница (index.php)--> <h1>Нажми кнопку и получи данные</h1> <form method="post" action="main.php"> <p><input type="text" name="cat"></p> <p><input type="submit" value="Дай данные"></p> </form> PHP: <?php //то что в примере названо main $cat=$_POST["cat"]; if (checkCat($cat)){ list($data,$err)=getData($cat); } echo "<pre>$data</pre>"; //собственно функция getData, которая должна вернуть данные и сообщить что не все гладко. function getData($cat){ message = $data = null; try { $data = $db->getData(); } catch (DbException $e) { $message = $e->getMessage(); try { $data = $files->getData(); } catch (FilesException $fe) { throw new FatalException('Жопа'); } return array($data,$message;) } } ?>