try catch copy и ошибка 404

Статус
В этой теме нельзя размещать новые ответы.

vipTelnet

Постоялец
Регистрация
14 Янв 2013
Сообщения
143
Реакции
11
Качаю картинки с сервера таким вот образом
Код:
    if(!empty($arr[1])){
        try {
            copy( trim($arr[1]), $_SERVER['DOCUMENT_ROOT'].'/images/products/'.$arr[0].'/h_'.count($lines).'.'.substr(strrchr(trim($arr[1]), '.'), 1));
        } catch(Exception $ex) {
            $log->logWrite('Ошибка строка '.$line_num.' Файл '.$arr[1].' не может быть скачана\n '.$ex->getMessage);
        }
    }
Все нормально работает пока не происходит такая ошибка
Warning: copy(Для просмотра ссылки Войди или Зарегистрируйся) [Для просмотра ссылки Войди или Зарегистрируйся]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in/var/www/x/data/www/x/components/com_db1c/views/group/tmpl/import_img.php on line 55
Я уже прилипил туда типа обработку ошибок try catch но ошибка все равно генерируется и выводится в браузер не ужели без @copy ни как нельзя убить вывод ошибки, и по возможности залогировать ее
 
try cath - перехватывает только так называемые исключения, а не вообще ошибки. Вообще сама функция как бы не особо предназначена для скачки, с удалённого сервера, чтобы просить её быть умной, для такой работы. Если требуются подробности от ошибке - file_get_contents, socket, curl.
Но, конечно же можно спокойно работать и так -
Код:
 $f = @copy( trim($arr[1]), $_SERVER['DOCUMENT_ROOT'].'/images/products/'.$arr[0].'/h_'.count($lines).'.'.substr(strrchr(trim($arr[1]), '.'), 1));

if(!$f){

$log->logWrite('Ошибка строка '.$line_num.' Файл '.$arr[1].' не может быть скачана\n '.$ex->getMessage);
}

или, если всё таки нужно направить через исключения

Код:
if(!empty($arr[1])){
        try {
      
 $f = @copy( trim($arr[1]), $_SERVER['DOCUMENT_ROOT'].'/images/products/'.$arr[0].'/h_'.count($lines).'.'.substr(strrchr(trim($arr[1]), '.'), 1));

if(!$f){
  throw new Exception('Error download');
}
        
        } catch(Exception $ex) {
            $log->logWrite('Ошибка строка '.$line_num.' Файл '.$arr[1].' не может быть скачана\n '.$ex->getMessage);
        }
    }
 
Спасибо не знал что try cath не все перехватывает
я что то думал что все абсолютно все ошибки fatal waring notice
$f = @copy
Тоже в голове что то похожие крутилось но родить не смог
 
или, если всё таки нужно направить через исключения
Формально, более универсально set_error_handler использовать, передавать имя функции-обработчика, А в обработчике уже throw Exception кидать.

не ужели без @copy ни как нельзя убить вывод ошибки, и по возможности залогировать ее
Можно вообще warning-и все через error_level убрать. А логировать в зависимости от результата, который вернёт copy
 
Да не обработка исключений не обязательно просто это первое что пришло в голову
А после использования set_error_handler обязательно нужно использовать restore_error_handler?
 
А после использования set_error_handler обязательно нужно использовать restore_error_handler?
Зависит от архитектуры приложения.. Если стандартный обработчик не нужен - не обязательно. Между вызовами значение не сохраняется, и при следующем обращении (или при обращении к другому скрипту) изначально будет стандартный обработчик.
 
stealthdebuger, тема спорная, но ИМХО разумное использование @ в отдельных случаях может быть вполне оправдано. В конкретном, например, поведение функции документированное, ошибка обрабатывается. ИМХО, вполне уместно (и по реализации проще, чем "навороты" с обработчиками)
 
KillDead, тру-кодер и @copy :smmne:
я говнокодер и не скрываю этого :crazy: Но чего тебе не нравится в отключении ошибки? Ну, самое страшное что здесь возможно- будут долбить в попытках чтото залить куда не надо, а не по прописанному пути, а мы знать не будем, так как лог ошибок будет молчать. Мне вообще кажется что использовать copy для скачки по интернетам- ещё большее зло... Или есть ещё чтото?
 
Мне вообще кажется что использовать copy для скачки по интернетам- ещё большее зло..

Прошу прокомменитировать, почему зло, если эта функция позволяет это делать?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху