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

时间:2012-05-15 19:18:38

标签: php exception-handling

我正在使用php应用程序,并且有一行移动文件。我将该方法包含在try ... catch块中,因此,如果抛出错误,则可以管理回滚系统。但是异常永远不会被捕获,因此,重命名会引发任何异常?我需要尝试其他方法吗?

由于

以上代码:

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

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

4 个答案:

答案 0 :(得分:7)

“正常”PHP函数不会抛出异常。

更改代码以模拟异常:

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

答案 1 :(得分:3)

rename()只返回true / false - 没有抛出异常。

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

答案 2 :(得分:2)

失败时返回FALSE。见http://php.net/manual/en/function.rename.php

如果在重命名失败时确实需要抛出异常,则可以执行以下操作:

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

现在,您可以在try {} catch {}块周围将其包装在您调用此代码的位置。

答案 3 :(得分:0)

您还可以使用与此答案中所述相同的方法: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及更高版本中,它允许使用保留关键字作为方法名称。