Обработать исключительную ситуацию как в питоне.

japan_wave

Новичок
Добрый день и привет всем на этом замечательном форуме! Извиняюсь, если нарушил ваши правила - прошу сильно не пинать новичка.

Я привык к обработке исключений и ошибок в стиле python:

PHP:
try:
    //этот код возможно откажет
except:
    //если код всё же отказал
Теперь пытаюсь сделать обработку ошибок(исключений) в php скрипте. Честно прочитал этот и еще несколько мануалов

Но так и не понял, как мне достичь своих целей - имеется php файл, мне нужно чтобы сделать так чтобы если некий участок кода в нём не смог исполнится, то весь остальной код бы продолжал исполнятся, а я бы получил письмо.
Я написал:
PHP:
try {
	require_once($_SERVER['DOCUMENT_ROOT']."/new_admin/admin/"."меня нет.php");
	print("ошибок нет");
}
catch(Exception $ex) {
	print("ошибки есть");
	//sendmail(ну ты понел);
}
Почему это не работает@что я не понимаю.

Спасибо.
 

Absinthe

жожо
PHP страдает проблемами обратной совместимости, в нем нельзя исправлять говноархитектурные вещи, чтобы не сломать совместимость со старым кодом.
В том же python сделали несовместимую ветку(python 3), но все используют python 2. Потому что код работает.

Ранее было принято обрабатывать ошибки через error-коды, а не исключения.

В твоем случае используй include_once. Она не выкидывает фатальную ошибку.

Ну и вот это добавь:
PHP:
set_error_handler(function($no,$str,$file,$line) {
    throw new БлаException(блаблабла);
});
 

japan_wave

Новичок
PHP страдает проблемами обратной совместимости, в нем нельзя исправлять говноархитектурные вещи, чтобы не сломать совместимость со старым кодом.
В том же python сделали несовместимую ветку(python 3), но все используют python 2. Потому что код работает.

Ранее было принято обрабатывать ошибки через error-коды, а не исключения.

В твоем случае используй include_once. Она не выкидывает фатальную ошибку.

Ну и вот это добавь:
PHP:
set_error_handler(function($no,$str,$file,$line) {
    throw new БлаException(блаблабла);
});
А можно пример кода?
Включение файла обработать получилось, а вызов неопределенных функций дальше по коду - нет.

Мне нужно fatal error перехватывать. Или я вообще думаю не так?
Я смогу только послать письмо через register_shutdown_function, но продолжить скрипт и отобразить страницу я не смогу, верно?
 

Absinthe

жожо
Или я вообще думаю не так?
В PHP не обязательно работать таким образом, можно это обходить.
Поэтому пиши так, чтобы не вызывать неопределенных функций.
Используй фреймворк.

Мне нужно fatal error перехватывать.
Нельзя.

Я смогу только послать письмо через register_shutdown_function, но продолжить скрипт и отобразить страницу я не смогу, верно?
Да.
 

dimitrius

Новичок
Чтобы поймать исключение его сначала надо выбросить, а require_once исключения не выбрасывает.
Можешь сделать обертку, которая будет выбрасивать исключение, и тогда твоя структура будет работать.
Вообще эта логика работает в php плохо, если сравнивать с C++
 

Ragazzo

TDD interested
Absinthe
fatal error же перехватывать можно через ob_* функции, только парсить надо. Об этом даже на хабре писали :)
 

fixxxer

К.О.
Партнер клуба
Это извращение. :)
Поясню. На девеле вывести место фатал еррора достаточно и обычным образом. А на проде не может быть display_errors=on.

Хотя я не понимаю зачем парсить ob, есть же error_get_last или что-то подобное. Если оно работает в шатдаун-функции (а почему бы нет), вот это можно использовать.

Но все равно лучше писать так, чтобы фатальных ошибок в тех случаях, когда требуется catch, просто не было. В приведенном ТС примере например использовать include_once.

Кстати, вместо БлаException лучше использовать стандартный http://ru.php.net/ErrorException
 

Absinthe

жожо
fatal error же перехватывать можно через ob_* функции, только парсить надо. Об этом даже на хабре писали
Нельзя. Можно сделать только затычку для нормального вывода ошибки. Но это не перехват, т.к. мы не можем продолжать программу с места завершения try-блока.
 

Ragazzo

TDD interested
Absinthe
чушь. вопрос был о том чтобы его перехватить, а не о том что дальше нельзя ничего делать.
вопрос звучал так:
Мне нужно fatal error перехватывать.
ты вдаешься в полемику ненужную.
 

Absinthe

жожо
вопрос был о том чтобы его перехватить, а не о том что дальше нельзя ничего делать.
После перехвата исключения код должен выполняться. Тут нет полноценного перехвата - мы только получаем событие о исключении.
 

japan_wave

Новичок
Ммм ребята, вы тут много чего уже понаписали, поясню свою ситуацию:
Есть просто html сайт(без админки), к нему прикрученн модуль констант(сверху каждой страницы стоит прикрепление файла с функциями, в коде страницы можно писать
PHP:
<?=get_constant_by_name("курс доллара");?>
) Как сделать, чтобы сайт по прежнему работал, если файл с функциями потеряется? Я хочу чтобы страницу человек увидел любом случае.
 

Absinthe

жожо
japan_wave нельзя такого хотеть. Файл с функциями потеряться не должен.

И еще. Лучше пользователь пусть не увидит результата, чем увидит кривой или неправильный.
 

Ministr

Новичок
Можно проверить наличие файла, прежде чем его использовать. Можно проверить существует ли переменная и не пустая ли она, прежде чем её использовать.
 
Сверху