【问题标题】:PHP try...catch failing to "catch" [duplicate]PHP尝试...捕获未能“捕获” [重复]
【发布时间】:2014-07-16 19:45:09
【问题描述】:

我有以下代码,该文件是一个 ajax 调用:

try {
    echo json_encode(exif_read_data($_POST["url"]));
} catch (Exception $e) {
    echo "Invalid URL";
}

它的目的是接受一个图像 url 并返回 JSON 编码的 EXIF 数据,当有一个“正确”的 url 时,json_encode(exif_read_data($_POST["url"])); 工作正常。

但是,当我故意在 jQuery ajax 调用 "url" : "url1" 或直接在 php 文件中 ..exif_read_data("bob") 中传递一个“错误”url 时,我在控制台日志中收到此错误:

Warning: exif_read_data() [function.exif-read-data]: Unable to open file in ../public_html/_photos/ajax/exif.php on line 3
false

【问题讨论】:

  • PHP 标准函数不会抛出异常。曾经。没有什么可以尝试/捕捉的,因为没有任何东西被抛出。这也是一个警告,而不是错误
  • 我明白了,有没有办法“捕捉”这些警告?
  • 快速/肮脏/丑陋的黑客,使用@ 运算符。更好的解决方案:不要尝试直接用php函数打开url。

标签: php json try-catch exif


【解决方案1】:

函数 json_encode() 不会抛出异常,如果您想将警告作为异常抛出,您可以使用 set_error_handler() 覆盖默认行为

Here 你会找到很好的例子

【讨论】:

    【解决方案2】:

    函数 exif_read_data($sUrl) 不会抛出异常。

    尝试这样做:

       $sUrl = $_POST['url'];
    
       if ((isset($sUrl )) AND (file_exists($sUrl)))
       {
    
          echo json_encode(exif_read_data($sUrl ));
       }
       else
       {
         echo "Invalid URL";
       }  
    

    【讨论】:

      【解决方案3】:

      正如 Marc 在 cmets 中提到的,原生 PHP 函数不会抛出异常。要正确处理无效 url,您可以手动验证文件,然后将内容的数据 uri 传递给 exif_read_data()

      以下是您可以实现的方法。

      // acceptable file extensions
      $ext_whitelist = array('jpg', 'jpeg', 'tiff');
      
      // extension for this file name
      $extension = strtolower( pathinfo($_POST['url'], PATHINFO_EXTENSION) );
      
      // make sure we will be able to get the exif data
      if (!in_array($extension, $ext_whitelist)) {
          echo 'Invalid URL';
      } else {
          $contents = file_get_contents($_POST['url']);
      
          // we couldn't open the file
          if ($contents === false) {
              echo 'Invalid URL';
          } else {
              // build the data uri
              $uri = "data://image/$extension;base64,". base64_encode($contents);
      
              echo json_encode( exif_read_data($uri) );
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-12-16
        • 2014-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多