PHP try...catch failing to "catch"


PHP try...catch failing to "catch"

我有以下代码,文件是一个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"]));工作正常。

然而,当我故意传递它一个"坏"的url在jQuery ajax调用"url" : "url1",或在php文件直接..exif_read_data("bob"),我收到这个错误在我的控制台日志:

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

函数json_encode()不抛出异常,如果你想抛出警告作为异常,你可以覆盖默认行为与set_error_handler()

这里你会发现一个很好的例子如何做到这一点

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";
   }  

正如Marc在评论中提到的,本地PHP函数不会抛出异常。为了正确处理无效的url,您可以手动验证文件,然后将内容的data-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) );
    }
}