PHP rename () не вызывает исключение при ошибке

Я работаю с php-приложением, и есть строка, которая перемещает файл. Я включил метод в блок try … catch, поэтому, если возникла ошибка, можно управлять системой отката. Но исключение никогда не вылавливается, поэтому переименовывает ли какие-либо исключения? Нужно ли мне попробовать другой метод?

благодаря

Код выше:

try{ if(rename($archivo_salida, $ruta_archivos)){ //anything; } }catch (Exception $e) //do something } 

«Нормальные» функции PHP не генерируют исключений.

Измените свой код, чтобы имитировать исключение:

 try{ if(rename($archivo_salida, $ruta_archivos)){ //anything; } else { throw new Exception('Can not rename file'.$archivo_salida); } }catch (Exception $e) //do something } 

rename() только когда-либо возвращает true / false – исключение не выбрано.

http://php.net/manual/en/function.rename.php

Он возвращает FALSE при сбое. См. http://php.net/manual/en/function.rename.php

Если вам действительно нужно исключение, которое нужно сбросить при неудачном переименовании, вы можете сделать это:

 if (rename($archivo_salida, $ruta_archivos)) { // anything; } else { throw new Exception("Rename failed."); } 

Теперь вы можете обернуть это вокруг блока try {} catch {} где бы вы не вызывали этот код.

Вы также можете использовать тот же подход, который описан в этом ответе: https://stackoverflow.com/a/43364340/563049

Создайте настраиваемый класс исключений и используйте его метод статического конструктора с or после rename() .

Класс исключений:

 class CustomException extends Exception { static public function doThrow($message = "", $code = 0, Exception $previous = null) { throw new Exception($message, $code, $previous); } } 

Применение:

 try { rename($archivo_salida, $ruta_archivos) or CustomException::doThrow('Renaming failed.'); } catch (Exception $e){ //do something } 

Заметка

Если вы используете PHP 7 и выше, вы можете переименовать статический метод doThrow() чтобы просто throw() , поскольку в PHP 7 и выше разрешено использовать зарезервированные ключевые слова в качестве имен методов.