Я работаю с 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 – исключение не выбрано.
Он возвращает 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 и выше разрешено использовать зарезервированные ключевые слова в качестве имен методов.