PHP rename()不会在出错时抛出异常

icnyk63a  于 2023-03-16  发布在  PHP
关注(0)|答案(4)|浏览(148)

我正在使用一个php应用程序,其中有一行是用来移动文件的。我把这个方法包含在一个try...catch块中,这样,如果抛出一个错误,就可以管理一个回滚系统。但是这个异常从来没有被捕获过,所以,renames抛出了任何类型的异常吗?我需要用另一个方法来尝试吗?
谢谢
以上代码:

try{
   if(rename($archivo_salida, $ruta_archivos)){
    //anything;
   }

}catch (Exception $e)
  //do something
}
js81xvg6

js81xvg61#

“普通”PHP函数不会抛出异常。
更改代码以模拟异常:

try {
   if (rename($archivo_salida, $ruta_archivos)) {
      //anything;
   } else {
      throw new Exception('Can not rename file'.$archivo_salida);
   }
} catch (Exception $e) {
   //do something, such as
   echo 'Caught exception: ',  $e->getMessage(), "\n";
}
7xllpg7q

7xllpg7q2#

rename()只返回true/false -没有抛出异常。
http://php.net/manual/en/function.rename.php

ep6jt1vc

ep6jt1vc3#

失败时返回FALSE。请参见http://php.net/manual/en/function.rename.php
如果确实需要在重命名失败时引发异常,可以执行以下操作:

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

现在,您可以将其 Package 在try {} catch {}块中,无论您在何处调用此代码。

mbjcgjjk

mbjcgjjk4#

您也可以使用此答案中描述的相同方法:https://stackoverflow.com/a/43364340/563049
创建一个自定义异常类,并使用其静态构造函数方法,在rename()之后使用or运算符。
异常类:

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或更高版本中允许使用保留关键字作为方法名。

相关问题