ИМХО, если бы механизм исключений в РНР мог отлавливать фатальные ошибки, то это было бы тогда охринительно. Но, увы: PHP: <? try { UnknownFunction(UnknownArgument); } catch (Exception $e) { if(preg_match('/([a-z_]+?[a-z0-9_]*?\(\))/i', $e->GetMessage(), $functionName)) { echo "Function ".$functionName[1]." has not been defined"; } } ?> Заместо этого мы будем делать вызов фунцкии function_exists.
В этом и разница: в случае trigger_error ты можешь отловить ошибку только в handler'е, а в случае использования исключений это можно сделать где-то еще. Т.е. ты можешь не вмешиваясь во внутренний код решить, обработать ошибку и принять меры или забить и пусть handler остановит скрипт. Конечно, это можно сделать и используя trigger_error, но тогда нужно будет отлавливать возвращаемый результат и проверять его на ошибку. Для примера: PHP: <?php /** * @return int кол-во чего-то или -1 если файл не найден, -2 если файл пустой, … */ function somefunc() { … return -1; … return -2; … return $n; } $num = somefunc(); if ($num == -1) trigger_error('file not found'); if ($num == -2) trigger_error('file is empty'); // vs /** * @return int … */ function secondFunc() { … throw new ExceptionFileNotFound(); … throw new ExceptionEmptyFile(); … return $n; } $num = secondFunc(); Другое дело, что большинство не привыкло отлавливать ошибки…
А зачем? Handler рул. PHP: <? set_error_handler("Handler"); function Handler($errno,$errstr,$errfile,$errline){ if(error_reporting()){ $errors=array( E_ERROR => 'Error', E_WARNING => 'Warning', E_PARSE => 'Parsing Error', E_CORE_ERROR => 'Core Error', E_CORE_WARNING => 'Core Warning', E_COMPILE_ERROR => 'Compile Error', E_COMPILE_WARNING => 'Compile Warning', E_USER_ERROR => 'User Error', E_USER_WARNING => 'User Warning',); if(array_key_exists($errno,$errors)){ die("Тип: ".$errors[$errno]."\r\nТекст: {$errstr}\r\nФайл: {$errfile}\r\nСтрока: {$errline}"); } } } function BlaBla(){ if() trigger_error("файл не найден",E_USER_ERROR); if() trigger_error("чё то там не найден",E_USER_ERROR); } ?> для этого можно менять ключи в trigger'е а в случае с классами, мне нравится делать внутренний Handler и там уже не обязательно trigger
я имел ввиду не PHP Fatal Errors а фатальны скриптовые, ну типа не могу прочитать файл и из-за этого теперь не будет работать весь класс
дык в том то и дело, что во первых она может его и не ловить, а во вторых какого фига она будет решать если это фатальная ошибка для этого класса
Если для класса критично, чтобы файл был доступен, то он кидает исключение. Как пример с ходу: есть обертка над БД, в ней вызываешь метод «использовать вот эту БД». А БД нет и прав для создания нет. Что класс должен сделать? Кидает исключение. А дальше уже включается логика более высокого по уровню логики класса (простите за тавталогию): если без этой БД жить может (есть другая БД или не особо-то и нужные данные), то отлавливает исключение, и работает по запасному варианту. А вот если нужна конкретно эта БД, то не ловит исключение, а пропускает его на более высокий уровень и тут опять более высокоуровневый класс может отловить исключение и т.д. Наконец, если ошибка неисправима, то вызывается exception handler и в нем уж происходит запись в лог/вывод/отсылка по почте и все такое, включая вывод «сорри, проводятся профилактические работы, зайдите через 5 минут» конечному пользователю)
ладно. но мне всё равно больше правится для таких вещей делать в классе внутренний ErrorHandler, как в DBSimple
Mr.M.I.T., по-моему ты просто фундаментально не понимаешь что такое исключения и что с ErrorHandler они никак не связаны.
По фундаментальному пониманию обычно лучше всех говорит Яндекс: обработка исключений в php. PS. И, вуаля, первая же ссылка на меня
vasa_c аи аи аи, всё к этому и шло? Ps/ Не, всё таки я всё правельно с исключениями понял, просто ты не совсем понял меня
Тогда объясняю в двух предложениях. 1-е. Подпрограмма по идее может сделать две вещи: сделать то что от неё хотели (или вернуть результат который просили) или сказать "ой, не могу". Причём говорит "ой, не могу" и дальше её ничего не интересует. 2-е. Какого е..го х..я, какая-то функция из какой-то сторонней библиотеки из-за того, что она не может что-то там сделать должна убивать весь сценарий?