有人可以帮助我将使用if-else编写的以下代码转换为try / catch。另外,让我知道在这种情况下需要trycatch或if-else是apt
$results = mysql_query($query);
if(mysql_num_rows($results)!=0)
{
while(($result = mysql_fetch_row($results))!=FALSE)
{
$res ="DELETE FROM table1 WHERE id ='".$result['id']."'";
if(mysql_query($res)==false)
{
echo mysql_error();
exit;
}
}
echo $res ="DELETE FROM table2 WHERE id ='".$id."'";
if(mysql_query($res)!==false)
{
header("Location:list.php?m=4");
}
else
{
echo mysql_error();
exit;
}
}
else
{
echo "Error";
}
答案 0 :(得分:5)
try...catch
只有在你的函数抛出异常时才有意义。如果他们不这样做,那么catch
就没有了。我从这开始作为重构:
$results = mysql_query($query);
if (!mysql_num_rows($results)) {
echo 'No results!';
exit;
}
$ids = array();
while (($result = mysql_fetch_row($results)) !== false) {
$ids[] = $result['id'];
}
$ids = array_map('mysql_real_escape_string', $ids);
$query = "DELETE FROM table1 WHERE id IN ('" . join("','", $ids) . "')";
if (!mysql_query($query)) {
echo mysql_error();
exit;
}
$query = "DELETE FROM table2 WHERE id = '$id'";
if (!mysql_query($query)) {
echo mysql_error();
exit;
}
header("Location: list.php?m=4");
exit;
这仍然可以改进很多,但它已经比你的意大利面条逻辑有了改进。如果您对正确使用异常非常感兴趣,那么首先应该继续正确使用重复任务的函数(如error, exit
部分),然后可能将整个事物重组为类和对象,最后使用异常现在嵌套的图层之间进行通信。也许开始使用PHP框架来感受整个事情。
将异常放入上述代码只需goto
,但仅用于说明目的:
try {
$results = mysql_query($query);
if (!mysql_num_rows($results)) {
throw new Exception('No results!');
}
$ids = array();
while (($result = mysql_fetch_row($results)) !== false) {
$ids[] = $result['id'];
}
$ids = array_map('mysql_real_escape_string', $ids);
$query = "DELETE FROM table1 WHERE id IN ('" . join("','", $ids) . "')";
if (!mysql_query($query)) {
throw new Exception(mysql_error());
}
$query = "DELETE FROM table2 WHERE id = '$id'";
if (!mysql_query($query)) {
throw new Exception(mysql_error());
}
header("Location: list.php?m=4");
exit;
} catch (Exception $e) {
echo 'ERROR: ' . $e->getMessage();
exit;
}
答案 1 :(得分:1)
从它的声音来看,似乎你认为try / catch和if-else是同样的行为。事实并非如此。 Try catch用于防止异常使应用程序崩溃或正常处理异常,以及执行日志记录和提供用户反馈。 If-else(else if)用于检查应用程序的内部状态,并相应地执行不同的操作。
通常,try-catch的效率低于switch-case或else-if方法。