В чем разница вызова exception

`p r o x y

Новичок
Время доброго
Пожалуйста, объясните разницу использования.

В Zend 2.0.2
Файл: ../Config/Writer/AbstractWriter.php
Метод: toFile
Есть участок:
PHP:
set_error_handler(
    function($error, $message = '', $file = '', $line = 0) use ($filename) {
        throw new Exception\RuntimeException(sprintf(
            'Error writing to "%s": %s',
            $filename, $message
        ), $error);
    }, E_WARNING
);
file_put_contents($filename, $this->toString($config), $flags);
restore_error_handler();
А почему не используется try/catch?
 

Фанат

oncle terrible
Команда форума
потому что file_put_contents не кидает исключение?
но вообще, конечно, этот код - дичь адова
 

`p r o x y

Новичок
Хм, значит не стоит использовать Zend как good practice для просветления.
Может есть хорошо сложенный FW?
 

Фанат

oncle terrible
Команда форума
там же написано - чтобы превратить ошибку в исключение.
причём почему-то не глобально по всему приложению, а точечно, для вызова одной-единственной функции. именно этот момент я и назвал дичью.
 

`p r o x y

Новичок
там же написано - чтобы превратить ошибку в исключение.
Там, это где?
Въехал. Исключение ловится, что бы обработать $this->toString($config).
Но какой-то смысл ведь должен быть в таком варианты по сравнению с try/catch.
 

Фанат

oncle terrible
Команда форума
господи, ну я же в самом начале написал, что file_put_contents не кидает исключение
как можно поймать то, чего нет?
 

`p r o x y

Новичок
Формулировка "там же написано - чтобы превратить ошибку в исключение." с первым постом не связана.
К тому же, непосредственно ошибка file_put_contents "не превратиться" в исключение же.
Поэтому и переспросил.
Благодарю за комментарии.
 

Фанат

oncle terrible
Команда форума
как это не связана?
по-моему, ты так ничего и не понял.
непосредственно ошибка file_put_contents "не превратиться" в исключение
а вот и не угадал.
Как раз наоборот - единственным назначением говнокода перед file_put_contents является превращение любой возникшей ошибки РНР в исключение.
ради этого всё и затевалось
 

Фанат

oncle terrible
Команда форума
в нормальных фреймворках такой хендлер устанавливается глобально, на всё приложение.
 

`p r o x y

Новичок
Любое исключение будет поймано, это ясно.
Но file_put_contents действительно не выкидывает исключение, а возвращается false в случае ошибки.
Поэтому, если не будет исключений, то ошибка работы file_put_contents не будет обработана.
Я не прав?
 

Фанат

oncle terrible
Команда форума
конечно нет
во-первых, дело не в том, что file_put_contents возвращает, а в том, что она выкидывает. а выкидывает она ошибку. обычный варнинг пхп.
во-вторых, для того, чтобы поймать этот варнинг, и служит функция set_error_handler.

поэтому, при наличии такой функции, ошибка будет обработана.
причем обрабка будет заключаться только в том, что будет вручную брошено исключение (throw), с текстом пойманной ошибки.

то есть, этот говнокод служит для превращения ошибки пхп в исключение.
которое будет поймано где-то ещё
 

fixxxer

К.О.
Партнер клуба
Сначала у меня было подозрение, что работа с конфигом производится до того, как фреймворк полностью проинициализирован. Но ведь это не чтение, а запись. Тогда я тоже не понимаю, на кой.
 

`p r o x y

Новичок
set_error_handler, ооо как я запутался. Ошибся и спутал set_error_handler с set_exception_handler.
Все, вопрос закрыт.
 

fixxxer

К.О.
Партнер клуба
Я бы уж тогда сделал наоборот

$error = catchError(function() use($filename, $contents) {
file_put_contents($filename, $contents);
});
if ($error) throw ...;

где catchError очищает last error, вызывает переданную функцию и возвращает get_last_error().
 

A1x

Новичок
не вижу в чем дичь, там же написано что метод toFile

* @throws Exception\InvalidArgumentException
* @throws Exception\RuntimeException

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

Фанат

oncle terrible
Команда форума
A1x
я предлагаю делать всё то же самое, но на глобальном уровне

дичь - писать эту колбасу перед каждой функцией
 
Сверху