Преимущества механизма исключений

Gorath

Новичок
Преимущества механизма исключений

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

Фанат

oncle terrible
Команда форума
у Котерова в новой книжке целая глава посвящена
там хорошо напысано
 

autosoft

Guest
Исключения позволяют писать более простой и компактый код.

Позволяют повысить надежность приложения (исключить множество концептуальных ошибок). Например при возникновении "стандартной ошибки" может понадобиться прекратить выполнение кода до определенного момента. Подумай как это сделать "стандартными" (баз механизма исключений) средствами. Код получается сложный. Его тяжело отлаживать. Особенно если это касается стека вызова функций. Исключения позволяют это сделать просто и прозрачно.

Например, код без исключений:
PHP:
function a($param) {

    return $param % 2 ? false : true;
}

function b($param) {

    $result = a($param);

    if ($result) $result = "Четное число";
    else
    if (0 < $param && $param < 50) $result = "Меньше 50";
    else $result = "";

    return $result;
}

for ($i = 1; $i < 100; $i++) {

    $result = b(rand(0, $i));

    if (strlen($result)) break;
}

echo $result;
и код с исключениями:
PHP:
function a($param) {

    if (!($param % 2)) throw new Exception("Четное число");
}

function b($param) {

    a($param);

    if (0 < $param && $param < 50) throw new Exception("Меньше 50");
}

try {

    for ($i = 1; $i < 100; $i++) b(rand(0, $i));

} catch (Exception $e) {

    echo $e;
}
Пример надуманный, но надеюсь принцип понятен.
 

Gorath

Новичок
То есть я так понял, что Exception и его потомки инкапсулируют всю инфу об ошибке и методы ее представления. Например к-л DBException может хранить sql запрос, описание ошибки с сервера и проч. То есть просто замена кодов возврата, так?
 

autosoft

Guest
В принципе да.
Exception - это класс. Его потомки могут содержать все необходимые тебе свойства. В том числе текст запроса SQL и т.д.
 

Screjet

Новичок
autosoft
Не очень удачный пример.
Новичек почитает и будет использовать исключения где надо и где не надо.
 

baev

‹°°¬•
Команда форума
[off]
А кто такой этот пан Новичек?
[/off]
 

Screjet

Новичок
PHP:
if (!($param % 2)) throw new Exception("Четное число");
Логичнее было бы так:
PHP:
function div( $n, $d ){
  if ( $d == 0 ){
    throw new Exception("Деление на ноль");
  }
  return $n / $d;
}
 

tz

Новичок
глупо всё это тут разводить... я бы посоветывал просто человеку почитать умные книжёнки на эту тему, т.к. просто объяснить данную тему невозможно. т.к. отсюда вывод: человек не знает других языков высого уровня. и голые примеры станут для него лишь примерами в неуместных местах)))
 

Gorath

Новичок
1. Покажите ваш диплом телепата, пожалуйста..
2. Посоветуйте "умные книжёнки", где хорошо описана данная тема, буду очень признателен.
 

alex_kh

Новичок
Кроме красоты кода - НИКАКОГО!!!

Когда я узнал, что в PHP5 есть исключения, то очень обрадывался (прикладные программисты меня поймут), но к сожалению...

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

Пример:
try{
//блокируем некую таблицу БД
//пытаемся выполнить опасный код
//ядро PHP выкидывает некое исключение, но не пишет в браузер и не прекращает работу
}
catch(Excеption $e){
//снимаем блокировку
//подчищаем хвосты
}

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

tony2001

TeaM PHPClub
>Для того, чтобы исключения в PHP5 приобрели настоящий вес необходимо, чтобы все
>ошибки интерпритатора были исключениями. Тогда действительно есть где
>разгуляться.

RTFM: [m]set_error_handler[/m]
 

alex_kh

Новичок
Автор оригинала: tony2001
>Для того, чтобы исключения в PHP5 приобрели настоящий вес необходимо, чтобы все
>ошибки интерпритатора были исключениями. Тогда действительно есть где
>разгуляться.

RTFM: [m]set_error_handler[/m]
Дело не в том, что мы можем добавить, а в том чтобы оно уже было.
 

tony2001

TeaM PHPClub
Поясни, плз, чем тебе не подходит set_error_handler() для конвертации ошибок в эксепшены.

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

alex_kh

Новичок
Автор оригинала: tony2001
Поясни, плз, чем тебе не подходит set_error_handler() для конвертации ошибок в эксепшены.

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

Не хочу ничего предопределять.

А хочу, что-бы ошибка сгенерированая ядром PHP внутри блока
try{} автоматически была исключением,
а в блоке catch(){} я уже сам решу важная она или нет, и если необходимо, выброшу свое исключение.

Ошибки произошедшие вне блока try{} пусть будут просто ошибками.
 

tony2001

TeaM PHPClub
>Не хочу ничего предопределять.
>А хочу

А я хочу, чтобы в сутках было 30 часов.
Причем, я хочу, чтобы так стало немедленно.

К выполнению моего желания можно приступать.
 

alex_kh

Новичок
Автор оригинала: tony2001
>Не хочу ничего предопределять.
>А хочу

А я хочу, чтобы в сутках было 30 часов.
Причем, я хочу, чтобы так стало немедленно.

К выполнению моего желания можно приступать.
:)

Не в смысле хочу, и все тут, а всмысле было-бы очень и очень удобно.

Даже читал, что планируется нечто подобное в версиях 5.1 или старше.

Типа в таком виде:

//тут "обычные" ошибки

declare("обьявление авто-преобразования"){

//тут ошибки преобразуются в исключения

}

// а тут - уже нет
 
Сверху