【问题标题】:PHP rename() doesn't throws exception on errorPHP rename() 不会在错误时抛出异常
【发布时间】:2012-05-23 08:33:30
【问题描述】:

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

谢谢

以上代码:

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

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

【问题讨论】:

    标签: php exception-handling


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      更改代码以模拟异常:

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

      【讨论】:

      【解决方案3】:

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

      如果你确实需要在重命名失败时抛出异常,你可以这样做:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-26
          • 2012-04-08
          • 1970-01-01
          • 1970-01-01
          • 2014-11-29
          • 1970-01-01
          • 2015-12-12
          • 1970-01-01
          相关资源
          最近更新 更多