Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
76 / 62 / 24
Регистрация: 21.06.2013
Сообщений: 330
1

Обработка исключений - какова лучшая практика в этом вопросе?

12.06.2014, 18:47. Показов 1685. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
А какова лучшая практика в этом вопросе?
Допустим я не знаю в каком месте у меня произойдёт ошибка, но я хотел бы эту ошибку видеть. В связи с этим catch использовать уже не представляется возможным. Что тогда остаётся? set_error_handler говорят устарел. Хорошо, а что тогда?

Нарыл вот такой подход. Предлагается сделать класс расширяющий Exception и вот такую конструкцию:

PHP
1
2
3
4
5
6
7
8
class MyException extends Exception {
   public function __construct($message, $errorLevel = 0, $errorFile = '', $errorLine = 0) {
      parent::__construct($message, $errorLevel);
      $this->file = $errorFile;
      $this->line = $errorLine;
   }
}
set_error_handler(create_function('$c, $m, $f, $l', 'throw new MyException($m, $c, $f, $l);'), E_ALL);
Я понимаю, тоже метод, но насколько это хорошо? Может ли такое решение претендовать на лучшее?
Что скажут мэтры?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.06.2014, 18:47
Ответы с готовыми решениями:

Реализация CRUD операций с большим количеством таблиц - лучшая практика?
Уважаемые Гуру! Задача - сделать менеджер таблиц (выполнение CRUD операций). Таблиц довольно...

Обработка исключений. Как организовать общий обработчик исключений?
У меня есть последовательность вызова методов для внесения данных в таблицу БД. Сам метод...

Обработка исключений с пмощью структурированной обработки исключений
Есть функция, которая определенным образом работает с файлами,но при работе с файлами "не...

Используется ли такая практика в обработке исключений?
Здравствуйте. Хочу отдельно обработать FoundException private Object ReadFromFile(int task) {...

18
2432 / 2282 / 594
Регистрация: 27.05.2011
Сообщений: 7,801
12.06.2014, 19:01 2
такое не поймает (неизвестная функция)
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 class MyException extends Exception {
    public function __construct($message, $errorLevel = 0, $errorFile = '', $errorLine = 0) {
    parent::__construct($message, $errorLevel);
    $this->file = $errorFile;
    $this->line = $errorLine;
 }
}
 
set_error_handler(create_function('$c, $m, $f, $l', 'throw new MyException($m, $c, $f, $l);'), E_ALL);
try{
 a();
}catch(MyException $e){
 echo 'error';
}
нужно через register_shutdown_function ловить
0
76 / 62 / 24
Регистрация: 21.06.2013
Сообщений: 330
12.06.2014, 19:13  [ТС] 3
Насколько я понял из документации register_shutdown_function выполняется при завершении или выходе. Ошибки могут не быть фатальными и следовательно никакого завершения или выхода не произойдёт - это раз. В самой этой функции потом не найти места, где случилось исключение - а это как раз таки и необходимо и класс Exception предоставляет для этого всё необходимое.
0
2432 / 2282 / 594
Регистрация: 27.05.2011
Сообщений: 7,801
13.06.2014, 11:55 4
Цитата Сообщение от corochoone Посмотреть сообщение
Ошибки могут не быть фатальными и следовательно никакого завершения или выхода не произойдёт - это раз.
Произойдет
класс Exception предоставляет для этого всё необходимое
Еще раз говорю, покажите мне код, который поймает ошибку вызова неизнестной функции. Не на словах, как вы тут развели демагогию, а на рабочем коде.
0
76 / 62 / 24
Регистрация: 21.06.2013
Сообщений: 330
13.06.2014, 13:58  [ТС] 5
С каких пор исследование документации является демагогией?
Я попробовал register_shutdown_function и вижу, что она работает НЕ ТАК как описано в документации. Вообще-то это баг. Делать программы в расчёте на баги я не собираюсь. В документации чёрным по белому написано:

Registers a callback to be executed after script execution finishes or exit() is called.
А функция срабатывает при встрече вызова неизвестной фукции.

Цитата Сообщение от crautcher Посмотреть сообщение
Еще раз говорю, покажите мне код, который поймает ошибку вызова неизнестной функции
Я не могу вам его показать. Поэтому и вопросы задаю в разделе ДЛЯ НАЧИНАЮЩИХ. Знал бы всё на свете чего бы стал спрашивать?

А теперь вы мне покажите рабочий код, где функция зареганная в register_shutdown_function ловит ситуацию открытия несуществующего файла.
0
2432 / 2282 / 594
Регистрация: 27.05.2011
Сообщений: 7,801
13.06.2014, 15:26 6
Цитата Сообщение от corochoone Посмотреть сообщение
А функция срабатывает при встрече вызова неизвестной фукции.
Ну, вызвалась функция неизвестная, произошла ошибка и скрипт завершился, после завершения вызывается финальная функция.
Цитата Сообщение от corochoone Посмотреть сообщение
Вообще-то это баг
Докажите
Цитата Сообщение от corochoone Посмотреть сообщение
С каких пор исследование документации является демагогией?
С тех, когда вы начинаете говорить ложь
Цитата Сообщение от corochoone Посмотреть сообщение
А теперь вы мне покажите рабочий код, где функция зареганная в register_shutdown_function ловит ситуацию открытия несуществующего файла.
Тут исключение как раз нужно. Но для галочки можно и без него:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?
class errors{ public static $errors=array(); }
 
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
  errors::$errors[] = array( $errno, $errstr, $errfile, $errline );
}
 
set_error_handler("myErrorHandler");
register_shutdown_function('ErrorSaver');
 
file_get_contents('wrong_file');
 
 
function ErrorSaver(){
  echo 'now u can save ur errors';
  var_dump(errors::$errors);
}
1
76 / 62 / 24
Регистрация: 21.06.2013
Сообщений: 330
13.06.2014, 15:31  [ТС] 7
Цитата Сообщение от crautcher Посмотреть сообщение
Докажите
Уже доказал, читайте внимательней:
Цитата Сообщение от corochoone Посмотреть сообщение
Registers a callback to be executed after script execution finishes or exit() is called.
Цитата Сообщение от crautcher Посмотреть сообщение
С тех, когда вы начинаете говорить ложь
И в чём же я солгал?

Цитата Сообщение от crautcher Посмотреть сообщение
Тут исключение как раз нужно. Но для галочки можно и без него:
Ну и что вы показали?
Уберите set_error_handler будет без него работать? Нет. О чём ещё говорить?
0
2432 / 2282 / 594
Регистрация: 27.05.2011
Сообщений: 7,801
13.06.2014, 15:38 8
Цитата Сообщение от corochoone Посмотреть сообщение
Уже доказал, читайте внимательней
Что-то является доказанным, когда апонент согласен, что ему что-то доказали. Вы не доказали мне ничего.
Цитата Сообщение от corochoone Посмотреть сообщение
И в чём же я солгал?
Тут
Цитата Сообщение от corochoone Посмотреть сообщение
класс Exception предоставляет для этого всё необходимое
Как уже показал пример, он не дает ловить некоторые ошибки, следовательно ваше высказывание ложно.
Уберите set_error_handler будет без него работать?
На кой черт мне его убирать? Уберите из вашего примера его и тоже ничего работать не будет.
0
76 / 62 / 24
Регистрация: 21.06.2013
Сообщений: 330
13.06.2014, 15:44  [ТС] 9
Цитата Сообщение от crautcher Посмотреть сообщение
Что-то является доказанным, когда апонент согласен, что ему что-то доказали. Вы не доказали мне ничего.
Ну т.е. факт того, что функция работает НЕ ТАК как описано в документации вас не смутил и ничего не доказывает. Хорошо. Проехали.

Цитата Сообщение от crautcher Посмотреть сообщение
Как уже показал пример, он не дает ловить некоторые ошибки, следовательно ваше высказывание ложно.
А вы попробуйте не выхватывать предложение из контекста и ещё раз прочитайте ПОЛНОСТЬЮ, что я написал:
Цитата Сообщение от corochoone Посмотреть сообщение
В самой этой функции потом не найти места, где случилось исключение - а это как раз таки и необходимо и класс Exception предоставляет для этого всё необходимое.
Попробуйте опровергнуть на примере. Я нигде не утверждал, что Exeception ловит все ошибки.

Цитата Сообщение от crautcher Посмотреть сообщение
На кой черт мне его убирать? Уберите из вашего примера его и тоже ничего работать не будет.
На тот чёрт. что задание звучало так:
Цитата Сообщение от corochoone Посмотреть сообщение
А теперь вы мне покажите рабочий код, где функция зареганная в register_shutdown_function ловит ситуацию открытия несуществующего файла.
А про set_error_handler в задании ни слова! А у вас ловит ситуацию именно она!
0
2432 / 2282 / 594
Регистрация: 27.05.2011
Сообщений: 7,801
13.06.2014, 15:56 10
На тот чёрт. что задание звучало так:
Тогда я скажу, что ваша задача глупая и в ней нет логики. Найдите другого программиста.
А про set_error_handler в задании ни слова! А у вас ловит ситуацию именно она!
Она и должна ловить, для этого ее и создали разработчики. Как без нее?
Опять таки для галочки..
PHP
1
2
3
4
5
6
7
8
9
10
<?
ob_start();
register_shutdown_function('ErrorSaver');
file_get_contents('wrong_file');
 
 
function ErrorSaver(){
  $data = ob_get_contents();
  echo "Error can be saved in file:" . $data;
}
0
365 / 372 / 89
Регистрация: 01.12.2013
Сообщений: 1,629
13.06.2014, 16:05 11
corochoone, вы должны различать исключения генерируемые программистом в случае если произошла ошибка по ходу выполнения и фатальные ошибки.. Рантайм(логические) ошибки программист должен отлавливать, генерировать исключения, которые будут обработаны в нужном месте программы и у него есть все возможности для этого. set_error_handler - это.. для разработчиков фреймворков, когда предполагается отлавливать ошибки самих программистов (криворуких) , которые используют фреймворк и не следят за собой..
0
76 / 62 / 24
Регистрация: 21.06.2013
Сообщений: 330
13.06.2014, 16:10  [ТС] 12
Цитата Сообщение от crautcher Посмотреть сообщение
Тогда я скажу, что ваша задача глупая и в ней нет логики. Найдите другого программиста.
Эта задача не глупее поставленной вами - отследить с помощью Exception вызов неизвестной функции, поскольку это невозможно.

Цитата Сообщение от crautcher Посмотреть сообщение
Она и должна ловить, для этого ее и создали разработчики. Как без нее?
Вот и я удивился, как? Если бы вы написали. что В ДОПОЛНЕНИИ к этой можно ещё использовать register_shutdown_function потому что она ловит вот такую ситуацию, которую не ловит set_error_handler - я бы ничего не сказал, за исключением того, что это недокументированная возможность и что использование register_shutdown_function не позволяет понять в каком месте кода встретился вызов неизвестной функции и вообще почему была вызвана функция register_shutdown_function - из-за ошибки или потому что выполнение скрипта НОРМАЛЬНО завершилось.

Добавлено через 2 минуты
Цитата Сообщение от ads Посмотреть сообщение
вы должны различать исключения генерируемые программистом в случае если произошла ошибка по ходу выполнения и фатальные ошибки.
Безусловно. Но беда в том, что мне нужно отлавливать и то и другое и желательно иметь для этого ЕДИНЫЙ механизм. Собственно поэтому и был задан начальный вопрос. Может быть это вопрос не для начинающих - не знаю, но меня он волнует.
0
2432 / 2282 / 594
Регистрация: 27.05.2011
Сообщений: 7,801
13.06.2014, 16:12 13
Цитата Сообщение от corochoone Посмотреть сообщение
Если бы вы написали. что В ДОПОЛНЕНИИ к этой можно ещё использовать register_shutdown_function
Всегда только "в дополнение" и имелось в виду

Добавлено через 2 минуты
Почему вообще возникли такие мысли, я ниразу не использовал слово "вместо".
0
365 / 372 / 89
Регистрация: 01.12.2013
Сообщений: 1,629
13.06.2014, 16:17 14
Цитата Сообщение от corochoone Посмотреть сообщение
для этого ЕДИНЫЙ механизм...но меня он волнует.
если вы ловите фатальную ошибку - у вас есть вариант вывести сообщение. скрипт уже упал. больше ничего не будет
0
76 / 62 / 24
Регистрация: 21.06.2013
Сообщений: 330
13.06.2014, 16:27  [ТС] 15
Не совсем верно, как уже показал crautcher

[Fri Jun 13 13:53:09.158753 2014] [:error] [pid 6152] [client 127.0.0.1:36689] PHP Fatal error: Call to undefined function open() in /var/www/mysite.ru/data/index.php on line 8

Но скрипт спокойно продолжает работать после этого.
0
2432 / 2282 / 594
Регистрация: 27.05.2011
Сообщений: 7,801
13.06.2014, 16:53 16
Цитата Сообщение от corochoone Посмотреть сообщение
Но скрипт спокойно продолжает работать после этого.
Только тело функции

Делаем обработчик ошибок. На исключениях или без - как хотите. Также вешаем шатдаун функцию, которая получит последнюю ошибку, убившую скрипт, через error_get_last(). Вот впринципе и у вас лог всех ошибок.
0
76 / 62 / 24
Регистрация: 21.06.2013
Сообщений: 330
13.06.2014, 16:56  [ТС] 17
Цитата Сообщение от crautcher Посмотреть сообщение
акже вешаем шатдаун функцию, которая получит последнюю ошибку, убившую скрипт, через error_get_last(). Вот впринципе и у вас лог всех ошибок.
А каким-то образом всё-таки можно в этой функции получить место, где произошло то, что убило скрипт?
0
2432 / 2282 / 594
Регистрация: 27.05.2011
Сообщений: 7,801
13.06.2014, 17:01 18
Лучший ответ Сообщение было отмечено Para bellum как решение

Решение

Цитата Сообщение от corochoone Посмотреть сообщение
А каким-то образом всё-таки можно в этой функции получить место, где произошло то, что убило скрипт?
функция вернет не только текст
PHP
1
2
3
4
5
6
7
8
<?
register_shutdown_function('FatalError');
fatal();
function FatalError(){
 $error = error_get_last();
 echo '<pre>';
 var_dump($error);
}
out:
Fatal error: Call to undefined function fatal() in /test/abs.php on line 3
array(4) {
["type"]=>
int(1)
["message"]=>
string(34) "Call to undefined function fatal()"
["file"]=>
string(29) "/test/abs.php"
["line"]=>
int(3)
}
0
76 / 62 / 24
Регистрация: 21.06.2013
Сообщений: 330
13.06.2014, 19:22  [ТС] 19
Ну тогда единственное, что меня смущает - это недокументированность особенности работы данной функции. В остальном я вроде удовлетворён. Спасибо!
0
13.06.2014, 19:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2014, 19:22
Помогаю со студенческими работами здесь

Какова практика распространения(дистрибуции) приложений WxErlang?
Признаюсь честно, знаком с erlang на уровне беглого чтения нескольких статей. Наличие wxerlang в...

Обработка исключений
Здравствуйте у меня есть поиск и если я введу что то неправильно то выскакивает ошибка мол бд...

Обработка исключений
Написал функцию которая возвращает true если простое число, false если нет : def...

Обработка исключений
Доброго времени суток!)) Люди подскажите как в PS реализовать обработку ошибок? Например: Скрипт...

Обработка исключений
Подскажите, пожалуйста, как обработать разные ошибки одного исключения POPAuthentificationError -...

Обработка исключений
Подскажите как обрабатывать исключение пока оно не исчезнет. Например: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru