如果发生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_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
}
顺便说一句,track是一个空数组,所以$track[0]会像您所说的那样"失败"。
你可以试试这样的东西:
catch (Exception $e)
{
$track[0] = //something
$track[1] = //something else
}
或者在函数调用后在外部处理它,但这将是一个混乱的