【问题标题】:Read array in case of catch exception [closed]在捕获异常的情况下读取数组[关闭]
【发布时间】:2013-08-27 11:49:11
【问题描述】:

在 catch (Exception $e) 的情况下,以下代码在 $lat = $track[0] 行失败。如何解决?

$track = getPositionalTrack();
$lat = $track[0];
$lon = $track[1];

function getPositionalTrack()
{
    $track = array();
    $url = "https://...";
    try
    {
        $result = file_get_contents($url);
        $obj = json_decode($result, true);
        $lat =  $obj["lat"];
        $lon = $obj["lon"];
        $track[0] = $lat;
        $track[1] = $lon;
    }
    catch (Exception $e)
    {
        die('ERROR: ' . $e->getMessage());
    }
    return $track;
}

【问题讨论】:

  • “失败”是什么意思?输出是什么?错误是什么?此外,try 块中的任何代码都不会抛出任何异常。
  • 你在try {}块中试过var_dump($obj);吗?
  • 另外,如果json_decode()有错误,您可以通过json_last_error()php.net/manual/en/function.json-last-error.php进行检查
  • 另外,我不会在这段代码中使用异常:正常的错误检查和处理会是更好的设计

标签: php arrays try-catch


【解决方案1】:

就像 deceze 指出的那样,file_get_contentsjson_decode 都不会抛出异常。 所以你必须以防御的方式重写函数来捕捉错误。

function getPositionalTrack()
{
    $url = "https://...";

    $result = file_get_contents($url);
    if (false === $result) {
        return null;
    }

    $obj = json_decode($result, true);
    if (null === $obj) {
        return null;
    }

    if (isset($obj['lat']) && isset($obj['lon'])) {
        return $obj;
    }

    return null;
}

$track = getPositionalTrack();
if (null !== $track) {
    $lat = $track['lat'];
    $lon = $track['lon'];
}

或者在函数中自己抛出异常:

function getPositionalTrack()
{
    $url = "https://...";

    $result = file_get_contents($url);
    if (false === $result) {
        throw new Exception('file_get_contents failed');
    }

    $obj = json_decode($result, true);
    if (null === $obj) {
        throw new Exception('json_decode failed');
    }

    if (isset($obj['lat']) && isset($obj['lon'])) {
        return $obj;
    }
    else {
        throw new Exception('no lat/lon keys');
    }

}

try {
    $track = getPositionalTrack();
    $lat = $track['lat'];
    $lon = $track['lon'];
}
catch (Exception $e) {
    // react on failure
}

【讨论】:

    【解决方案2】:

    顺便说一句,track 是一个空数组,所以 $track[0] 会像你说的那样“失败”。

    你可以试试这样的:

    catch (Exception $e)
    {
        $track[0] = //something
        $track[1] = //something else
    }
    

    或者在你的函数调用之后在外面处理它,但它会很乱

    【讨论】:

    • 如果你之后马上要去die,那有什么意义......? :P
    • @deceze 是的,我的错,刚刚粘贴了 OP 代码并忘记删除它,谢谢。编辑了这个
    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 2011-05-01
    • 2011-08-25
    • 2014-04-12
    • 1970-01-01
    • 2019-11-19
    • 2021-05-25
    • 1970-01-01
    相关资源
    最近更新 更多