Реализация исключений без try...catch

krafty

new Exception
Реализация исключений без try...catch

После странствий по ману выдрал один полезный примерчик.
Вот что получилось после незначительных изменений.
PHP:
<?php #Перехват ошибок и предупреждений
ini_set("error_log","user_log.txt");
error_reporting(E_ALL);
//определяем функцию-обработчик  
function catch($errno, $errstr, $errfile, $errline)
{
  //если включена собака - ничего не делаем
   if (error_reporting()==0) return;
   $GLOBALS['throw'] = $errstr;
   $GLOBALS['throw_info'] = array(
       'Message'=>$errstr
       ,'Code'=>$errno
       ,'Line'=>$errline
       ,'File'=>$errfile
       ,'Trace'=>debug_backtrace()
   ); 
}
//примерчик
function div($a,$b)
{
    if ($b==0)
     //возбуждение исключительной ситуации
      trigger_error("Деление на ноль");
    else return $a/$b;
}     
//начало потенциально опасного кода   try
set_error_handler("Catch");
$z=div(5,0);
echo $z;
$y=div(5,5);
echo $y;
//перехват исключений  catch
if ($GLOBALS['throw']) {
  echo $GLOBALS['throw'];
  //если надо - пишем ошибку в журнал
  error_log($GLOBALS['throw']);
}  
//восстанавливаем пред-ий обработчик
restore_error_handler()
Можно ли такую конструкцию использовать в реальном приложении?
 

master_x

Pitavale XXI wieku
чем тебе не понравился try...catch? если у тебя чисто теоретический вопрос, то используй, использовать можно хоть что угодно.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: krafty
Можно ли такую конструкцию использовать в реальном приложении?
Можно, вопрос только зачем.

Основное достоинство исключений в том, как они меняют последовательность исполнения кода. Реализовать это средствами PHP4 невозможно.
 

krafty

new Exception
Действительно, конструкция try...catch появилась только в PHP 5.
Sad Spirit
вопрос хороший и по делу. я уже сам убедился, что на PHP4 нельзя сделать ничего подобного. от предложенного мною варианта я уже сам отказался, поскольку не наше где же его можно применить! конечно, не хватает еще и полноценного оператора возбуждения исключения (типа throw).

выхожу я из ситуации при помощи проверки входных данных
if (!is_numeric($n)||$n<=0||$n>MAX_COUNT) {
error_log("Неверные параметры: n=$n");
echo "<span class=\"error\">Неверные параметры</span>";
include 'footer.php';
die();
}

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