try catch copy и ошибка 404

Тема в разделе "Как сделать...", создана пользователем vipTelnet, 28 сен 2013.

Статус темы:
Закрыта.
  1. vipTelnet

    vipTelnet Постоялец

    Регистр.:
    14 янв 2013
    Сообщения:
    133
    Симпатии:
    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(http://site.ru/img/gallery/PID.jpeg) [function.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 ни как нельзя убить вывод ошибки, и по возможности залогировать ее
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    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);
            }
        }
    
    
    
     
    latteo и vipTelnet нравится это.
  3. vipTelnet

    vipTelnet Постоялец

    Регистр.:
    14 янв 2013
    Сообщения:
    133
    Симпатии:
    11
    Спасибо не знал что try cath не все перехватывает
    я что то думал что все абсолютно все ошибки fatal waring notice
    $f = @copy
    Тоже в голове что то похожие крутилось но родить не смог
     
  4. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    360
    Симпатии:
    243
    Формально, более универсально set_error_handler использовать, передавать имя функции-обработчика, А в обработчике уже throw Exception кидать.

    Можно вообще warning-и все через error_level убрать. А логировать в зависимости от результата, который вернёт copy
     
  5. vipTelnet

    vipTelnet Постоялец

    Регистр.:
    14 янв 2013
    Сообщения:
    133
    Симпатии:
    11
    Да не обработка исключений не обязательно просто это первое что пришло в голову
    А после использования set_error_handler обязательно нужно использовать restore_error_handler?
     
  6. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    360
    Симпатии:
    243
    Зависит от архитектуры приложения.. Если стандартный обработчик не нужен - не обязательно. Между вызовами значение не сохраняется, и при следующем обращении (или при обращении к другому скрипту) изначально будет стандартный обработчик.
     
  7. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    624
    Симпатии:
    1.379
    KillDead, тру-кодер и @copy :smmne:
     
  8. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    360
    Симпатии:
    243
    stealthdebuger, тема спорная, но ИМХО разумное использование @ в отдельных случаях может быть вполне оправдано. В конкретном, например, поведение функции документированное, ошибка обрабатывается. ИМХО, вполне уместно (и по реализации проще, чем "навороты" с обработчиками)
     
  9. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    я говнокодер и не скрываю этого :crazy: Но чего тебе не нравится в отключении ошибки? Ну, самое страшное что здесь возможно- будут долбить в попытках чтото залить куда не надо, а не по прописанному пути, а мы знать не будем, так как лог ошибок будет молчать. Мне вообще кажется что использовать copy для скачки по интернетам- ещё большее зло... Или есть ещё чтото?
     
  10. vipTelnet

    vipTelnet Постоялец

    Регистр.:
    14 янв 2013
    Сообщения:
    133
    Симпатии:
    11
    Прошу прокомменитировать, почему зло, если эта функция позволяет это делать?
     
Статус темы:
Закрыта.