简单 try/finally 与 try/catch
Simple try/finally vs. try/catch
用简单的函数如:
function hello( $var )
{
try
{
// do something with $var which may or may not throw an exception
return $var;
}
finally
{
return $var;
}
}
如果转换为:
,在逻辑或处理上是否有任何差异?
function hello( $var )
{
try
{
// do something with $var which may or may not throw an exception
return $var;
}
catch( Exception $e )
{
return $var;
}
}
请忽略$e
没有做任何事情,请忽略示例函数的simplicity/uselessness;这只是一个 MCVE.
此转换的目的是使源代码在 PHP 5.3 中 100% 兼容,因为 finally{}
是在 5.5 中引入的,我希望在保持 100% 的同时进行必要的最小更改逻辑。
我之所以问,是因为我个人使用 try/catch/finally 块的经验很少,而且我不知道所有陷阱。
是否有更好的方法来实现PHP 5.3 兼容性?
如果您在 finally 语句中放置 return
,那么在 try 完成后它将始终为 运行。您的第一个示例(可能被删减)将使用来自 finally 子句的结果 return,而不是 try 子句。
您的第二个示例有点不同,因为您不清楚如何定义 $var
。如果您有 $var = $this->throwsException('x');
并且该行是抛出异常的地方,那么 $var
将在您的 catch 子句中未定义。如果 $var
已经定义,那么 catch 子句将是你 return 来自的地方,假设 try 子句抛出异常。
如果您需要 finally 子句的 PHP 5.3 安全版本,我会这样做:
$var = false;
try {
$var = $this->doSomething();
} catch (Exception $ex) {
$var = $ex->getMessage();
}
return $var;
用简单的函数如:
function hello( $var )
{
try
{
// do something with $var which may or may not throw an exception
return $var;
}
finally
{
return $var;
}
}
如果转换为:
,在逻辑或处理上是否有任何差异?function hello( $var )
{
try
{
// do something with $var which may or may not throw an exception
return $var;
}
catch( Exception $e )
{
return $var;
}
}
请忽略$e
没有做任何事情,请忽略示例函数的simplicity/uselessness;这只是一个 MCVE.
此转换的目的是使源代码在 PHP 5.3 中 100% 兼容,因为 finally{}
是在 5.5 中引入的,我希望在保持 100% 的同时进行必要的最小更改逻辑。
我之所以问,是因为我个人使用 try/catch/finally 块的经验很少,而且我不知道所有陷阱。
是否有更好的方法来实现PHP 5.3 兼容性?
如果您在 finally 语句中放置 return
,那么在 try 完成后它将始终为 运行。您的第一个示例(可能被删减)将使用来自 finally 子句的结果 return,而不是 try 子句。
您的第二个示例有点不同,因为您不清楚如何定义 $var
。如果您有 $var = $this->throwsException('x');
并且该行是抛出异常的地方,那么 $var
将在您的 catch 子句中未定义。如果 $var
已经定义,那么 catch 子句将是你 return 来自的地方,假设 try 子句抛出异常。
如果您需要 finally 子句的 PHP 5.3 安全版本,我会这样做:
$var = false;
try {
$var = $this->doSomething();
} catch (Exception $ex) {
$var = $ex->getMessage();
}
return $var;