[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: непонятное поведение try catch
sharki
Всем привет, что-то я от нечего делать подумал о try catch, написал тестовый код, с самой повседневной ошибкой - синтаксической.

try{
eval('<?php echo "fsdfsdf; ');
}catch(Exception $e){
echo $e->getMessage();
}
// or

try{
$v = new fsdfsdf();
}catch(Exception $e){
echo $e->getMessage();
}



Почему он не выкидывает исключение? А сразу мне 503 показывает!

Разве try ест только те ошибки, которые связаны с делениями на ноль и всякие мелочи?

Или есть что-то другое?





Спустя 50 минут, 42 секунды (10.11.2011 - 15:59) linker написал(а):
Исключения и ошибка при интерпретации кода - это разные вещи. Ошибки генерит PHP, а исключения - код. Если где-то в скрипте или php-библиотеки не было явного
throw new Exception('Я исключение, произошла ошибка');
то значит не было исключения, а раз его не было то и ловить нечего. Ещё повторю, что исключения генерит программист, а ошибки при интерпретации - непосредственно PHP и ловятся они через подмену в set_error_handler(), где собственно можно это дело завернуть в эксепшен.
function test($a)
{
if ($a === null)
throw new Exception('Значение переменной $a не может быть равным null');
}

try
{
test(null);
}
catch(Exception $e)
{
echo $e->getMessage();
}
Заворачиваем ошибки в эксепшен, о том какие ошибки можно перехватывать написано в PHP-мануале
function myError($num, $msg, $file, $line)
{
throw new Exception($msg);
}

set_error_handler('myError', E_ALL);

try
{
echo $a; // Генерим NOTICE, который будет говорить о том, что переменная $a не определена
}
catch(Exception $e)
{
echo 'Тут ошибочка в PHP-коде : ' . $e->getMessage();
}

Спустя 48 минут, 1 секунда (10.11.2011 - 16:47) sharki написал(а):
linker
Спасибо за разъяснение, почитал еще ман по этой теме, ничего нету для фильтрования ВСЕХ ошибок, а именно то, что я привел в пример smile.gif

Спустя 10 минут, 2 секунды (10.11.2011 - 16:57) m4a1fox написал(а):
sharki
Цитата
нету для фильтрования ВСЕХ ошибок

Для всех и не получится! Нужно отдельно классы делать для исключительных ситуаций а родителем у них - один общий класс Exception. ИМХО!

Спустя 6 минут, 58 секунд (10.11.2011 - 17:04) sharki написал(а):
m4a1fox
Нет, ты не понял, почитай пост linker про класс Exception. А я говорю про ошибки типа создания несуществующего класса, или выполнение кода евалом с ошибкой в подаваемой строке.

Спустя 3 часа, 53 минуты, 1 секунда (10.11.2011 - 20:57) Nikitian написал(а):
 function error_handler($errorType, $message, $errfile, $errline){
throw new Exception( strip_tags($message).' in ['.$errfile.'] on '.$errline.' line', $errorType);
}
function fatalErrorShutdownHandler() {
$last_error = error_get_last();
if ($last_error['type'] === E_ERROR) {
// fatal error
error_handler(E_ERROR, $last_error['message'], $last_error['file'], $last_error['line']);
}
}

set_error_handler('error_handler');
register_shutdown_function('fatalErrorShutdownHandler');

как-то так

Спустя 4 минуты, 24 секунды (10.11.2011 - 21:01) sharki написал(а):
Nikitian
Спасибо) Завтра на работе гляну.

Спустя 12 часов, 8 минут, 53 секунды (11.11.2011 - 09:10) sharki написал(а):
Nikitian
Не, все равно при таком коде
function error_handler($errorType, $message, $errfile, $errline){
throw new Exception( strip_tags($message).' in ['.$errfile.'] on '.$errline.' line', $errorType);
}
function fatalErrorShutdownHandler() {
$last_error = error_get_last();
if ($last_error['type'] === E_ERROR) {
// fatal error
error_handler(E_ERROR, $last_error['message'], $last_error['file'], $last_error['line']);
}
}

set_error_handler('error_handler');
register_shutdown_function('fatalErrorShutdownHandler');



try{
$v = new fsdfsdf();
}catch(Exception $e){
echo $e->getMessage();
}


Не срабатывает try

Спустя 46 минут, 17 секунд (11.11.2011 - 09:56) linker написал(а):
Потому, что не срабатывает функция error_handler(). А не срабатывает она потому, что в твоём коде ошибка из типа FATAL, когда продолжение работы скрипта не возможно и ядро PHP прерывает его работу. Открой уже мануал и почитай, какие типы ошибок можно перехватывать, а какие нет.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.