【问题标题】:Turning PHP warnings into User defined Exception将 PHP 警告转换为用户定义的异常
【发布时间】:2019-11-13 18:35:03
【问题描述】:

使用语言:PHP
版本:5.6

我正在尝试使用以下功能将文件上传到服务器:

move_uploaded_file($source,$destination);

每当文件由于任何原因而无法上传时,例如

  • 权限被拒绝,
  • 找不到目标文件夹,
  • 它只是发出警告并继续代码的其他部分。 但是我想捕捉那个警告并改变程序的流程,如果任何警告是用他们的名字引发的,这样我就可以抛出适当的异常。

    我目前正在使用try{}catch(){} 块上传文件,但警告没有引发异常。

    已编辑 找到这个...

    move_uploaded_file($source,$destination);
    

    根据文件上传的状态返回真或假。但它没有说明原因。怎么知道?

  • 【问题讨论】:

    • 这是一个警告,所以它不会抛出它自己的异常。 move_uploaded_file 如果失败则返回 false,因此您可以随时在那里抛出自己的异常。
    • @aynber 感谢您的意见。但是,如果想知道文件上传失败的原因呢?
    • 您可能想看这里 (stackoverflow.com/questions/1241728/can-i-try-catch-a-warning)。使用错误处理程序应该可以让您获得更多信息。
    • 在错误处理程序中,您可以查找Permission denied 等...
    • 如果您仍在使用 PHP 5,我强烈建议您尽快升级。不再支持此版本。 Let Rasmus Lerdorf explain it to you

    标签: php file-upload php-5.6


    【解决方案1】:

    我猜set_error_handler() 将是正确的选择。请务必仔细阅读文档。

    https://www.php.net/manual/en/function.set-error-handler.php.

    首先,您需要一个函数(或公共类方法)来处理错误。 示例:

    function error_handler($code, $text, $file, $line) {
        echo sprintf('code: %s, text: %s, file: %s, line: %s', $code, $text, $file, $line );
    
        return false; // continue with PHPs error handling
    }
    

    其次,在您的 init/bootstrap 代码中的某处调用 set_error_handler。指定您的 error_handler 方法并为您希望被告知的情况设置适当的标志。

    $flags = E_ALL & ~(E_STRICT | E_NOTICE);
    set_error_handler('error_handler', $flags);
    error_reporting($flags);
    

    警告:如果您打算捕获内存不足等错误,您的代码应准备好使用尽可能少的内存。此外,资源可能不再可用(如数据库连接或文件句柄)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      • 2023-02-24
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 2017-02-01
      • 1970-01-01
      相关资源
      最近更新 更多