[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: try-catch?
Nikitian
Столкнулся с довольно странным поведением try-catch. Долгое время как-то само-собой обходил его стороной, но... Короче, привычка из javascript и здравый смысл победили, а вот логику пыха понять не могу: нижеприведённый код выводит OK, хотя файла такого нет:
<?php
try
{
$fh = fopen("fakefile", "r");
echo'OK';
}
catch (Exception $e){
echo 'Ошибка открытия файла. '.$e->getMessage();
}
Бросать исключения ручками получается, а вот ловить неожиданные не хочет, хотя по логике должен (



Спустя 15 минут, 48 секунд (8.01.2011 - 17:47) jetistyum написал(а):
ну потому что у тебя ф-я fopen не выбрасывает исключение
попробуй так


<?php
try
{
$fh = fopen("fakefile", "r");
if (!$fh) {
throw new Exception('Unable to open file.');
}
else
echo'OK';
}
catch (Exception $e){
echo 'Ошибка открытия файла. '.$e->getMessage();
}

Спустя 10 минут, 47 секунд (8.01.2011 - 17:58) Nikitian написал(а):
Это-то как раз понятно. Хотел как в JS: завернул проблемный участок кода в try-catch и не паришься: если там возникнет проблема, то её решаешь без лишних алярмов. Бросать эксепшны самостоятельно - это одно, но далеко не всегда можно предвидеть, что например mysql_query() не сработает, т.к. слишком долго держится соединение или в процессе работы скрипта база перезагрузилась... Чтобы на каждый шаг не вешать проверки хотел вызов модуля в try-catch завернуть и повесить цепочку эксепшнов: сперва известные, потом неизвестные.

Спустя 9 минут, 11 секунд (8.01.2011 - 18:07) jetistyum написал(а):
Можешь попробовать поискать либу, в которой уже предусмотрены эксепшны, а сам пхп не выбрасывает исключения, может в 6 версии что-то изменится

Спустя 5 минут, 7 секунд (8.01.2011 - 18:12) Nikitian написал(а):
Странно. Думал это только у меня какая-то мега-бага засела, а это оказывается так и должно быть? Разочарован (
Вот тут например тоже в примерах примерно как у меня предлагается. Что за бред?

Спустя 3 минуты, 23 секунды (8.01.2011 - 18:16) jetistyum написал(а):
Читай внимательнее

Практика
Когда же удобно использовать исключения? Да всегда, когда функция или метод может прийти к ошибочной ситуации! На примере встроенной функции mysql_connect() и mysql_select_db(), если бы они бросала исключения при ошибке соединения и выборе базы данных соответственно, код выглядел бы так:

try {
mysql_connect($hostname, $username, $password);
mysql_select_db($dbname);
} catch (Exception $e) {
echo $e->getMessage(); //выведет либо сообщение об ошибке подключения, либо об ошибке выбора
}

Спустя 4 минуты, 32 секунды (8.01.2011 - 18:20) Nikitian написал(а):
Йа креведко (:

Спустя 15 минут, 31 секунда (8.01.2011 - 18:36) Nikitian написал(а):
Решил такое поведение почти полностью:
function error_handler($errorType, $message){
throw new Exception( $message, $errorType);
}
set_error_handler('error_handler');

Теперь выбрасывает нормальные эксепшны, кроме парсерроров и фаталов, но эти уж совсем плохо допускать на продакшн )

Спустя 5 минут, 35 секунд (8.01.2011 - 18:41) twin написал(а):
А что вообще ексепшенам на продакшене... во блин заворот кишок словоблудие... делать?

Спустя 9 минут, 22 секунды (8.01.2011 - 18:51) Nikitian написал(а):
Логироваться им там и выдавать пользователю что-то более интересное, нежели "Ooops", в зависимости от контекста. В случае с эксепшнами можно для каждого модуля и даже действия сделать собственную реакцию на ошибки, хотя обработчик изначально один.
Быстрый ответ:

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