-1

在 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;
}
4

2 回答 2

2

就像 deceze 指出的那样,既file_get_contents不会也json_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
}
于 2013-08-27T12:11:07.513 回答
0

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

你可以尝试这样的事情:

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

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

于 2013-08-27T11:54:31.023 回答