Как Митч и другие , вы не должны поймать исключение, которое вы не планируете обрабатывать каким-либо образом. Вы должны учитывать, как приложение будет систематически обрабатывать исключения при разработке. Это обычно приводит к тому, что уровни обработки ошибок основаны на абстракциях - например, вы обрабатываете все ошибки, связанные с SQL, в своем коде доступа к данным, так что часть приложения, взаимодействующая с объектами домена, не подвержена тому факту, что где-то есть БД под капотом.
Есть несколько связанных запахов кода, которые вы определенно хотите избежать, в дополнение к запаху «лови все везде» .
«catch, log, rethrow» : если вы хотите вести журнал на основе границ, то напишите класс, который выдает оператор log в своем деструкторе, когда стек разворачивается из-за исключение (аля std::uncaught_exception()
). Все, что вам нужно сделать, это объявить экземпляр журнала в интересующей вас области, и, вуаля, у вас есть протоколирование и нет ненужной логики try
/ catch
.
«поймай, брось переведено» : обычно это указывает на проблему абстракции. Если вы не внедряете федеративное решение, в котором вы переводите несколько конкретных исключений в одно более общее, вы, вероятно, имеете ненужный уровень абстракции ... и не говорите, что "оно может понадобиться мне завтра" .
«поймать, очистить, отбросить» : это одна из моих любимых мозолей. Если вы видите многое из этого, вам следует применить методы «Приобретение ресурсов - инициализация» и поместить часть очистки в деструктор экземпляра объекта janitor . [ тысячу сто двадцать четыре]
Я считаю код, усеянный блоками try
/ catch
, хорошей целью для проверки и рефакторинга кода. Это указывает на то, что либо обработка исключений не совсем понятна, либо код стал am'ba и нуждается в серьезном рефакторинге.
Я не верю, что есть какой-то волшебный способ сделать это. Вам просто нужно постоянно проверять размер файла и выводить любые новые данные. На самом деле это довольно просто, и единственное, на что следует обращать внимание, это то, что размеры файлов и другие статистические данные кэшируются в php. Чтобы решить эту проблему, вызовите clearstatcache ()
перед выводом каких-либо данных.
Вот небольшой пример, который не включает никакой обработки ошибок:
function follow($file)
{
$size = 0;
while (true) {
clearstatcache();
$currentSize = filesize($file);
if ($size == $currentSize) {
usleep(100);
continue;
}
$fh = fopen($file, "r");
fseek($fh, $size);
while ($d = fgets($fh)) {
echo $d;
}
fclose($fh);
$size = $currentSize;
}
}
follow("file.txt");
Вместо опроса файлов вы регулярно проверяете время изменения файла: filemtime
$handler = fopen('somefile.txt', 'r');
// move you at the end of file
fseek($handler, filesize( ));
// move you at the begining of file
fseek($handler, 0);
И, вероятно, вы захотите рассмотреть возможность использования stream_get_line