[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Исключения в php
Rabbit
Добрый день, хотел попросить помощи а именно объясните как работают исключения в PHP?



Спустя 25 минут, 28 секунд (11.04.2011 - 15:58) Raito-kun написал(а):

Спустя 9 минут, 28 секунд (11.04.2011 - 16:08) linker написал(а):
function mega_secure_func($kode = null)
{
if (is_null($kode))
throw new Exception('Fatal error. Kode is null.');
}

$a = null;
try
{
mega_secure_func($a);
}
catch(Exception $Except)
{
die($Except->getMessage());
}

Спустя 8 минут, 28 секунд (11.04.2011 - 16:16) twin написал(а):

Спустя 8 минут, 15 секунд (11.04.2011 - 16:24) Trianon написал(а):
twin
у тебя добрее, можно подумать... smile.gif

Спустя 2 минуты, 40 секунд (11.04.2011 - 16:27) twin написал(а):
У меня хоть русские буквы есть)))

UPD Кстати, когда писал, пересмотрел кучу материала. Если кто найдет более легкое описание, подскажите. Любопытно.

Спустя 7 минут, 52 секунды (11.04.2011 - 16:35) Trianon написал(а):
Попытаюсь показать, почему ответ linker'а мне более симпатичен.

у него в основном потоке вычислений (довольно куцем, но тем не менее потоке) :
mega_secure_func($a);

нет и намека на проблемы. И так и должно быть.

А у тебя что здесь
    if(!$f = fopen('dummy.txt', 'a+'))
throw new Exception('Не могу открыть файл dummy.txt');


что здесь
 
$f = fopen('dummy.txt', 'r')
or except('Не могу открыть файл dummy.txt');


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


Спустя 11 минут, 13 секунд (11.04.2011 - 16:46) twin написал(а):
Ну это из той же оперы, что оффтоп по FAQ. Я там промолчал, потому что были двойственные чувства.
Разумеется обертки куда как предпочтительнее, по mysql_query кстати я давным давно предложил такую штуку.
Но с другой стороны для этого нужно созреть, сам механизм обработки ошибок легче понять, когда она в основном потоке.

Однако вот тут немного все же не согласен. Вот тут
 $f = fopen('dummy.txt', 'r') 
or except('Не могу открыть файл dummy.txt');
функция except() и является своего рода оберткой, которая при желании слогирует ошибку или просто запретит вывод в поток. Больше в неё передать нечего, тут нет текста запроса, как в случае с SQL.




Спустя 3 минуты, 17 секунд (11.04.2011 - 16:49) Trianon написал(а):
twin
Здесь должно остаться что-то вроде $f = open_file('dummy.txt', 'r');
И всё.
Остальное уже отвлечение от сути решения.

в самой open_file может сработать бомба throw, except , die() или еще чего-нибудь, и как-то судьбу вытянуть.

Основной код беспокоиться не должон.

Спустя 24 минуты, 28 секунд (11.04.2011 - 17:14) Raito-kun написал(а):
Цитата
У меня хоть русские буквы есть)))

в моей ссылке en на ru поменять и тоже появятся)))

Спустя 10 минут, 32 секунды (11.04.2011 - 17:24) twin написал(а):
Цитата
Здесь должно остаться что-то вроде $f = open_file('dummy.txt', 'r');
И всё.
Как то не очень мне это по душе... Писать обертку под каждую функцию... Проще же использовать одну универсальную. Да и основной синтаксис не страдает. Кто его знает, что там в open_file() творится... Неуютно как то.

Спустя 11 минут, 41 секунда (11.04.2011 - 17:36) Trianon написал(а):
Под каждую, с возможными траблами которой не хочется возиться среди пира.
К счастью, таковых в реальной практике не то что бы очень много...
Но ведь смысл функций и состоит в том, чтобы писать вызовы чаще, чем определения.

Спустя 14 часов, 56 минут, 43 секунды (12.04.2011 - 08:33) linker написал(а):
Действительно, в основном потоке лучше вообще не использовать исключения. Они более необходимы когда происходят вызовы функций, методов, когда основной поток не "контролирует" выполнение кода внутри них. Именно для таких вызовов используются исключения. В блок try {} заносятся вызовы функций, которые могут сгенерировать исключение, в catch(){} мы пишем код, который будет реагировать на них.

Спустя 4 дня, 8 часов, 44 минуты, 55 секунд (16.04.2011 - 17:18) twin написал(а):
Вот решил я пересмотреть свои взгляды на компановку. Прислушаться к советам и не делать диагностики в основном потоке. И тут же этот метод потерпел полное фиаско. Как с эксепшенами, так и с or die.

Вся беда в том, что по схеме с обертками мы получаем файл и номер строки именно обертки, а не виновника злоключений.

Так что тут скорее всего интереснее использовать компромиссы. В обертках на часто используемые функции юзать debug_backtrace(); и весь остальной джентельменский набор. А с функциями попроще, но требующих логирования не брезговать и в потоке прописать пару строк по моей схеме.

А вот эксепшены тут вообще выпадают. Как громоздкое, тормозное, мутное и вообще ненужное явление.

Спустя 2 дня, 20 часов, 54 минуты, 28 секунд (19.04.2011 - 14:12) linker написал(а):
twin
try
{
...
}
catch(Exception $e)
{
echo $e->getTraceAsString();
}
еще афигенно кохана отдает трейсы, я в своём фрейме тоже подобное реализовал.

Спустя 7 часов, 3 минуты, 50 секунд (19.04.2011 - 21:16) twin написал(а):
Да, со стеком можно помудрить - факт)
Займусь на досуге, спс. Как то я ему особого значения не придавал, зря как видимо.

Спустя 13 часов, 10 минут, 40 секунд (20.04.2011 - 10:27) linker написал(а):
Вот мой эксепшен (в разработке пока, но все же) с трейсами

Спустя 10 минут, 40 секунд (20.04.2011 - 10:37) kirik написал(а):
Красивенько smile.gif
Быстрый ответ:

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