发生catch异常时读取数组


Read array in case of catch exception

如果发生catch(异常$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;
}

类似于decze所指出的,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
}

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

你可以试试这样的东西:

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

或者在函数调用后在外部处理它,但这将是一个混乱的