Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> try... catch... 
:(
    Опции темы
Opik
Дата 18.5.2005, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 3
Всего: 55



Вот в PHP5 появилась возможность "ловить" smile допустим те же ошибки.
В принципе для обработки ошибок можно сделать так:
Код

<?php 
// PHP 5 
// index.php file
try { 
   // Вся работа сайта :) подключения и так далее
   $mod = 'news.php';
   if(!file_exists($mod))
   {
         throw new Exception("mod: {$mod} is not found"); 
   }
   else
   {
         include($mod);
   }
} catch (Exception $e) { 
    // Обрабатываем ошибки.
       $out  = "<h1>".get_class($e)."</h1>\n"; 
       $out .= "<h2>{$e->getMessage()} ({$e->getCode()})</h2>\n\n"; 
       $out .= "file: {$e->getFile()}<br />\n"; 
       $out .= "line: {$e->getLine()}<br />\n"; 
       $out .= $e->getTraceAsString(); 
       die($out); 
}
?> 

Что вы считаете по поводу такого подхода к ошибкам?

Это сообщение отредактировал(а) Opr - 18.5.2005, 10:17
PM MAIL Skype   Вверх
Mal Hack
Дата 18.5.2005, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Подход классный, но смысл его применять есть только там, где подобгная конструкия будет работать вместо многих IF'ов...
В приципе в try ... catch идеально пихать работу модуля или транзакции SQL запросов...
PM ICQ   Вверх
simanyay
Дата 18.5.2005, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


Профиль
Группа: Участник
Сообщений: 2053
Регистрация: 22.8.2002

Репутация: нет
Всего: 36



Цитата(Opr @ 18.5.2005, 11:49)
Что вы считаете по поводу такого подхода к ошибкам?


Весьма упрощает код, делает его безопасней и стабильней.


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
<Spawn>
Дата 23.5.2005, 05:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 2
Всего: 64



Кроме того позволяет централизованно обрабатывать все возможные ошибки, уменьшает обьем всего кода(а для интрепретатора это весьма важно smile )

И по поводу кода - не совсем правильно было бы каждый раз в скриптах делать анализ данных и писать throw. Для этого нужно либо написать обертки нужных функций(возможно, даже используя классы). Возможно, в следующих версиях PHP это будет учтено smile

Т.е., ИМХО, все должно выглядеть примерно так(код, разумеется упрощен для показания сути идеи smile ):

Код

<?php 
//includeex.php
  class includeex_exception extends Exception { };

  function includeex($mod)
  {
    (!file_exists($mod)) ?
      throw new includeex_exception("mod: {$mod} is not found") :
      include($mod);
  }

// PHP 5 
// index.php file
include("includeex.php");

try { 
   // Вся работа сайта :) подключения и так далее
   $mod = 'news.php';
   includeex($mod);
} catch (Exception $e) { 
    // Обрабатываем ошибки.
       if ($e instanceof includeex_exception)
       {
         $out  = "<h1>".get_class($e)."</h1>\n"; 
         $out .= "<h2>{$e->getMessage()} ({$e->getCode()})</h2>\n\n"; 
         $out .= "file: {$e->getFile()}<br />\n"; 
         $out .= "line: {$e->getLine()}<br />\n"; 
         $out .= $e->getTraceAsString(); 
         die($out);
       }
}
?>


Это сообщение отредактировал(а) <Spawn> - 23.5.2005, 05:24


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Opik
Дата 24.5.2005, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 3
Всего: 55



<Spawn>
да, толковое замечание, спасибо, постараюсь учесть.
PM MAIL Skype   Вверх
Ciber SLasH
Дата 21.1.2006, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Не мойму, почему функция:
Код

function incCounter_3($file_name) {
    if (isset($file_name)) {
        try{
            $fp = fopen($file_name, 'r+');
            flock($fp, LOCK_EX);
            $st = fread($fp, filesize($file_name));
            rewind($fp);
            fwrite($fp, ++$st);
            flock($fp, LOCK_UN);
            fclose($fp);
            return true;
        } catch (Exception $e) {
            exit($e->getMessage());
            return false;
        }
    }
}

выдаёт всегда true, даже если файл не существует ?
По идеи при первой ошибке должны попасть в блок catch. Да и вообще походу в блок catch функция не когда не попадает, что-то не работает этот Exception...
PM   Вверх
AntonioBanderaz
Дата 21.1.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 18



Код

function incCounter_3($file_name) {    
    if (isset($file_name)) {    
        try{    
            if(!is_file($file_name)) thow new Exeption("file: $file_name is not found");
            $fp = fopen($file_name, 'r+');    
            flock($fp, LOCK_EX);    
            $st = fread($fp, filesize($file_name));    
            rewind($fp);    
            fwrite($fp, ++$st);    
            flock($fp, LOCK_UN);    
            fclose($fp);    
            return true;    
        } catch (Exception $e) {    
            exit($e->getMessage());    
            return false;    
        }    
    }    
}

А вообще правильнее будет делать как показал <Spawn>
Тоесть обернуть запись в файл
Код

$fp = fopen($file_name, 'r+');    
            flock($fp, LOCK_EX);    
            $st = fread($fp, filesize($file_name));    
            rewind($fp);    
            fwrite($fp, ++$st);    
            flock($fp, LOCK_UN);    
            fclose($fp);

в отдельный класс или функцию, а дальше уже в ней выкидывать исключения....


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
Ciber SLasH
Дата 21.1.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Цитата(AntonioBanderaz @ 21.1.2006, 17:49 Найти цитируемый пост)

if(!is_file($file_name)) thow new Exeption("file: $file_name is not found");

А где же тогда преимущества блока try {} catch {} ?
Ведь даже в JavaScript и то не нужно никаких условий в блоке try {} catch {}. При любой ошибке интерпретатор автоматом должен переходить в блок catch {}.
По сути твой вариант — этот та же проверка if-ами.
PM   Вверх
AntonioBanderaz
Дата 22.1.2006, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 18



Цитата(<Spawn> @ 23.5.2005, 05:23 Найти цитируемый пост)

позволяет централизованно обрабатывать все возможные ошибки, уменьшает обьем всего кода(а для интрепретатора это весьма важно)




--------------------
ГЫ... 
PM MAIL ICQ   Вверх
Ciber SLasH
Дата 22.1.2006, 04:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Не намного таким макаром уменьшается размер кода.
По сути: здесь ветка else { exit('Error'); } при проверке if-ами, заменяется на throw ('Error');

Вот пример того, как должен "по-человечески" работать этот механизм:
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  f: TextFile;
begin
  try
    AssignFile(f, 'log.dat');  // связываем файловую переменную с несуществующим файлом
    Reset(f);  // пытаемся открыть его. На этом месте компилятор перепрыгивает в блок "except", т.к. здесь ошибка
    Write(f, '1');  // операторы ниже, до блока except — не выполняются
    CloseFile(f);
  except
    MessageBox(0, 'Файл открыть не удалось !!', 'Error', MB_OK + MB_ICONERROR);
    HALT;
  end;
end;

PM   Вверх
AntonioBanderaz
Дата 22.1.2006, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 18



Цитата(Ciber SLasH @ 22.1.2006, 04:23 Найти цитируемый пост)

Вот пример того, как должен "по-человечески" работать этот механизм:

Как он должен работать, я знаю... не только с PHP знаком...
Добавлено @ 19:28
посути там ещё и finally должён присутствовать....


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
sammix
Дата 24.1.2006, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 1.10.2005

Репутация: 1
Всего: 2



try catch по скорости не очень. Если очень нужно быстродействие, то этим способом лучше не пользоваться, а обойтись if else.
PM MAIL   Вверх
IZ@TOP
Дата 25.1.2006, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



sammix, основания для данного заявления есть? Неужели пару операторов try...catch медленее чем несколько десятков if...else?


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
-=Ustas=-
Дата 25.1.2006, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: нет
Всего: 69



В верхних постах обсуждался метод function includeex($mod). Так у меня вот такой вопрос... Если инклюдить какой-нить модуль через метод объекта или просто через функцию, то все переменные, находяшиеся в головном файле (который инклюдит) становятся невидны в инклюженном файле, ну это и понятно, в принципе.... Это как-то решается?


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
IZ@TOP
Дата 25.1.2006, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



-=Ustas=-, у меня все модули это классы. Если хочешь подключать просто код, ставь в начале global $var_name.

ПС При чем тут try catch?


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0622 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.